/ Hex Artifact Content
Login

Artifact b0b124781474e4e0c8f64022875e5e2009e13443:


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 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  iParm = iParm;. 
04a0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
04b0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
04c0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  Mem = 0;.  pDest
04d0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a  ->nMem = 0;.}...
04e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
04f0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0500: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0510: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0520: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0530: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0540: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0560: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0570: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0580: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0590: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
05a0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
05b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
05c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
05d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
05e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
05f0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0600: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0610: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0620: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0630: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0640: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0650: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0660: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0670: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0680: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0690: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
06a0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
06b0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
06c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
06d0: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
06e0: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
06f0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0700: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
0870: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
0880: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
0890: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08a0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08b0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08d0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
08e0: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
08f0: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0900: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0910: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65   = pEList;.  pNe
0920: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
0930: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
0940: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
0950: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0960: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
0970: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
0980: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
0990: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
09a0: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
09b0: 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46   isDistinct ? SF
09c0: 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20  _Distinct : 0;. 
09d0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
09e0: 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70  ELECT;.  pNew->p
09f0: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
0a00: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
0a10: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73  = pOffset;.  ass
0a20: 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20  ert( pOffset==0 
0a30: 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  || pLimit!=0 );.
0a40: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a50: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
0a60: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a70: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
0a80: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a90: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
0aa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0ab0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
0ac0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lect(db, pNew);.
0ad0: 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73      if( pNew!=&s
0ae0: 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33  tandin ) sqlite3
0af0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
0b00: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
0b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0b20: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  w;.}../*.** Dele
0b30: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
0b40: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
0b50: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
0b60: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
0b70: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0b80: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
0b90: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
0ba0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0bb0: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
0bc0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
0bd0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
0be0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
0bf0: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
0c00: 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74  ers preceeding t
0c10: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
0c20: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
0c30: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
0c40: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
0c50: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
0c60: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
0c70: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
0c80: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0c90: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
0ca0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
0cb0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53  .**     JT_CROSS
0cc0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
0cd0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
0ce0: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
0cf0: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
0d00: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
0d10: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
0d20: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
0d30: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
0d40: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
0d50: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
0d60: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
0d70: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
0d80: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
0d90: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
0da0: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
0db0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
0dc0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
0dd0: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50  qlite3JoinType(P
0de0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0df0: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0e00: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0e10: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0e20: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0e30: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0e40: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p;.             
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20  /*   0123456789 
0e70: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
0e80: 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61  789 123 */.  sta
0e90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
0ea0: 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74  KeyText[] = "nat
0eb0: 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74  uraleftouteright
0ec0: 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b  fullinnercross";
0ed0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0ee0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20  struct {.    u8 
0ef0: 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  i;        /* Beg
0f00: 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72  inning of keywor
0f10: 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65  d text in zKeyTe
0f20: 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e  xt[] */.    u8 n
0f30: 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67  Char;    /* Leng
0f40: 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72  th of the keywor
0f50: 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20  d in characters 
0f60: 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20  */.    u8 code; 
0f70: 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65      /* Join type
0f80: 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65   mask */.  } aKe
0f90: 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  yword[] = {.    
0fa0: 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20  /* natural */ { 
0fb0: 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41  0,  7, JT_NATURA
0fc0: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L               
0fd0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20   },.    /* left 
0fe0: 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a     */ { 6,  4, J
0ff0: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
1000: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1010: 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20  /* outer   */ { 
1020: 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  10, 5, JT_OUTER 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74   },.    /* right
1050: 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a     */ { 14, 5, J
1060: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
1070: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1080: 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20  /* full    */ { 
1090: 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a  19, 4, JT_LEFT|J
10a0: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
10b0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72   },.    /* inner
10c0: 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a     */ { 23, 5, J
10d0: 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20  T_INNER         
10e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
10f0: 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20  /* cross   */ { 
1100: 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c  28, 5, JT_INNER|
1110: 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20  JT_CROSS        
1120: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
1130: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
1140: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
1150: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
1160: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
1170: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1180: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1190: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
11a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79  for(j=0; j<Array
11b0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20  Size(aKeyword); 
11c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
11d0: 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a  p->n==aKeyword[j
11e0: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
11f0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
1200: 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e  NICmp((char*)p->
1210: 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65  z, &zKeyText[aKe
1220: 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e  yword[j].i], p->
1230: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
1240: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65   jointype |= aKe
1250: 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20  yword[j].code;. 
1260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1280: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c  testcase( j==0 |
1290: 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c  | j==1 || j==2 |
12a0: 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c  | j==3 || j==4 |
12b0: 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29  | j==5 || j==6 )
12c0: 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72  ;.    if( j>=Arr
12d0: 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29  aySize(aKeyword)
12e0: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
12f0: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
1300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1310: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
1320: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
1330: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1340: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
1350: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
1360: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
1370: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
1380: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1390: 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73  p = " ";.    ass
13a0: 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20  ert( pB!=0 );.  
13b0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
13c0: 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  Sp++; }.    sqli
13d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13e0: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
13f0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1400: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
1410: 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c  "%T %T%s%T", pA,
1420: 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20   pB, zSp, pC);. 
1430: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1440: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
1450: 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20  if( (jointype & 
1460: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
1470: 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74         && (joint
1480: 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1490: 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45  T_RIGHT))!=JT_LE
14a0: 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  FT ){.    sqlite
14b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14c0: 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20  , .      "RIGHT 
14d0: 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a  and FULL OUTER J
14e0: 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72  OINs are not cur
14f0: 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64  rently supported
1500: 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  ");.    jointype
1510: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1520: 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79  .  return jointy
1530: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  pe;.}../*.** Ret
1540: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1550: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74   a column in a t
1560: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  able.  Return -1
1570: 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a   if the column.*
1580: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
1590: 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ed in the table.
15a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
15b0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65  olumnIndex(Table
15c0: 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68   *pTab, const ch
15d0: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74  ar *zCol){.  int
15e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
15f0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
1600: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1610: 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  e3StrICmp(pTab->
1620: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[i].zName, z
1630: 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Col)==0 ) return
1640: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1650: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   -1;.}../*.** Se
1660: 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e  arch the first N
1670: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c   tables in pSrc,
1680: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
1690: 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ght, looking for
16a0: 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74   a.** table that
16b0: 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61   has a column na
16c0: 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a  med zCol.  .**.*
16d0: 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65  * When found, se
16e0: 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69  t *piTab and *pi
16f0: 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65  Col to the table
1700: 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d   index and colum
1710: 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68  n index.** of th
1720: 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  e matching colum
1730: 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55  n and return TRU
1740: 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20  E..**.** If not 
1750: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41  found, return FA
1760: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
1770: 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  nt tableAndColum
1780: 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73  nIndex(.  SrcLis
1790: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f  t *pSrc,       /
17a0: 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65  * Array of table
17b0: 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  s to search */. 
17c0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
17d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17e0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  of tables in pSr
17f0: 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68  c->a[] to search
1800: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1810: 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61   *zCol,    /* Na
1820: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1830: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
1840: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  for */.  int *pi
1850: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
1860: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
1870: 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a  pSrc->a[] here *
1880: 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20  /.  int *piCol  
1890: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
18a0: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
18b0: 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d  >a[*piTab].pTab-
18c0: 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a  >aCol[] here */.
18d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
18e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
18f0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
1900: 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a  bles in pSrc */.
1910: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
1920: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1930: 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69  of column matchi
1940: 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73  ng zCol */..  as
1950: 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29  sert( (piTab==0)
1960: 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20  ==(piCol==0) ); 
1970: 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74   /* Both or neit
1980: 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a  her are NULL */.
1990: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
19a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  i++){.    iCol =
19b0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72   columnIndex(pSr
19c0: 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43  c->a[i].pTab, zC
19d0: 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  ol);.    if( iCo
19e0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l>=0 ){.      if
19f0: 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20  ( piTab ){.     
1a00: 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20     *piTab = i;. 
1a10: 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20         *piCol = 
1a20: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iCol;.      }.  
1a30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1a60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1a70: 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20  ed to add terms 
1a80: 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20  implied by JOIN 
1a90: 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a  syntax to the.**
1aa0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
1ab0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45  pression of a SE
1ac0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1ad0: 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68  The new term, wh
1ae0: 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20  ich.** is ANDed 
1af0: 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e  with the existin
1b00: 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  g WHERE clause, 
1b10: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
1b20: 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63  **.**    (tab1.c
1b30: 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29  ol1 = tab2.col2)
1b40: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
1b50: 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68  1 is the iSrc'th
1b60: 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73   table in SrcLis
1b70: 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20  t pSrc and tab2 
1b80: 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63  is the .** (iSrc
1b90: 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63  +1)'th. Column c
1ba0: 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  ol1 is column iC
1bb0: 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20  olLeft of tab1, 
1bc0: 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63  and col2 is.** c
1bd0: 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20  olumn iColRight 
1be0: 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74  of tab2..*/.stat
1bf0: 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65  ic void addWhere
1c00: 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1c10: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1c20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1c30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
1c70: 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  s in FROM clause
1c80: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c   */.  int iLeft,
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1cb0: 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f  f first table to
1cc0: 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f   join in pSrc */
1cd0: 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c  .  int iColLeft,
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
1d00: 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74  olumn in first t
1d10: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1d20: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
1d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d40: 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62  ex of second tab
1d50: 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  le in pSrc */.  
1d60: 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20  int iColRight,  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
1d90: 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62  mn in second tab
1da0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75  le */.  int isOu
1db0: 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20  terJoin,        
1dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1dd0: 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55  if this is an OU
1de0: 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78  TER join */.  Ex
1df0: 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20  pr **ppWhere    
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45   IN/OUT: The WHE
1e20: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64  RE clause to add
1e30: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69   to */.){.  sqli
1e40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1e50: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
1e60: 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a  1;.  Expr *pE2;.
1e70: 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20    Expr *pEq;..  
1e80: 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52  assert( iLeft<iR
1e90: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1ea0: 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69  ( pSrc->nSrc>iRi
1eb0: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
1ec0: 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e   pSrc->a[iLeft].
1ed0: 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74  pTab );.  assert
1ee0: 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74  ( pSrc->a[iRight
1ef0: 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31  ].pTab );..  pE1
1f00: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1f10: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
1f20: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c  Src, iLeft, iCol
1f30: 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73  Left);.  pE2 = s
1f40: 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75  qlite3CreateColu
1f50: 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c  mnExpr(db, pSrc,
1f60: 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67   iRight, iColRig
1f70: 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71  ht);..  pEq = sq
1f80: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1f90: 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70  e, TK_EQ, pE1, p
1fa0: 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45  E2, 0);.  if( pE
1fb0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
1fc0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
1fd0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
1fe0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
1ff0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
2000: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  nyProperty(pEq, 
2010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2020: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2030: 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
2040: 6c 65 28 70 45 71 29 3b 0a 20 20 20 20 70 45 71  le(pEq);.    pEq
2050: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2060: 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54  e = (i16)pE2->iT
2070: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57  able;.  }.  *ppW
2080: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
2090: 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65  prAnd(db, *ppWhe
20a0: 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a  re, pEq);.}../*.
20b0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
20c0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
20d0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
20e0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
20f0: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
2100: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
2110: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
2120: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
2130: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
2140: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
2150: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2160: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
2170: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
2180: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
2190: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
21a0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
21b0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
21c0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
21d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
21e0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
21f0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
2200: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
2210: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
2220: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
2230: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
2240: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
2250: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
2260: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
2270: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
2280: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
2290: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
22a0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
22b0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
22c0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22d0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
22e0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
22f0: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
2300: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
2310: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
2320: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2330: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
2340: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
2350: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
2360: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
2370: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
2380: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
2390: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
23a0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
23b0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
23c0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
23d0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23e0: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
23f0: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
2400: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
2410: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
2420: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
2430: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2440: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
2450: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
2460: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
2470: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
2480: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
2490: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
24a0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
24b0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
24c0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
24d0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
24e0: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
24f0: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
2500: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
2510: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
2520: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
2530: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
2540: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
2550: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
2560: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
2570: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
2580: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
2590: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
25a0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
25b0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
25c0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
25d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
25e0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
25f0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
2600: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2610: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
2620: 75 63 69 62 6c 65 28 70 29 3b 0a 20 20 20 20 70  ucible(p);.    p
2630: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2640: 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b  e = (i16)iTable;
2650: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
2660: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
2670: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
2680: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
2690: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26a0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
26b0: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
26c0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
26d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
26e0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
26f0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
2700: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
2710: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2720: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
2730: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
2740: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
2750: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
2760: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
2770: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
2780: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2790: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
27a0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
27b0: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
27c0: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
27d0: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
27e0: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
27f0: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
2800: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
2810: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
2820: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
2830: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
2840: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
2850: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
2860: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
2870: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
2880: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
2890: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
28a0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
28b0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
28c0: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
28d0: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
28e0: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
28f0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2900: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2910: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2920: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
2930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
2940: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
2950: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2960: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
2970: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2990: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
29a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
29b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29e0: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
29f0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
2a00: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
2a10: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2a20: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
2a30: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
2a40: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
2a50: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
2a60: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
2a70: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
2a80: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
2a90: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
2aa0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
2ab0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
2ac0: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
2ad0: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
2ae0: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
2af0: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
2b00: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
2b10: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
2b20: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
2b30: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
2b40: 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20  VER(pLeftTab==0 
2b50: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
2b60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b70: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
2b80: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2b90: 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20  T_OUTER)!=0;..  
2ba0: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
2bb0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
2bc0: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
2bd0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2be0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
2bf0: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
2c00: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
2c10: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
2c20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2c30: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2c40: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
2c50: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2c60: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
2c70: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
2c80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2c90: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
2ca0: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
2cb0: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
2cc0: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
2cd0: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
2ce0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2d00: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
2d10: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2d20: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2d30: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
2d40: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
2d50: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
2d60: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
2d70: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
2d80: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
2d90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
2da0: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
2db0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
2dc0: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
2dd0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
2de0: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
2df0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2e00: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
2e10: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
2e20: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
2e30: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
2e40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
2e50: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
2e60: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2e70: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
2e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e90: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
2ea0: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
2eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ec0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
2ed0: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
2ee0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2ef0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
2f00: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
2f10: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
2f20: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
2f30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2f40: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2f50: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2f60: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2f70: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2f80: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2f90: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2fa0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2fb0: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2fc0: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2fd0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2fe0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2ff0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3000: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3010: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3020: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3030: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3040: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3050: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3060: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3070: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3080: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3090: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
30a0: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
30b0: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
30c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
30d0: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
30e0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
30f0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3100: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3110: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3120: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3130: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3140: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3150: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3160: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3170: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3180: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3190: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
31a0: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
31b0: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
31c0: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
31d0: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
31e0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
31f0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3200: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3210: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3220: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3230: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3240: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3250: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3260: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3270: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3280: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3290: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
32a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
32b0: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
32c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
32d0: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
32e0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
32f0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3300: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3310: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3320: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3330: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3340: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3350: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3360: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3370: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3380: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3390: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
33a0: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
33b0: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
33c0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
33d0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
33e0: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
33f0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3400: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3410: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3420: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3430: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3440: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3450: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3460: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3470: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3480: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3490: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
34a0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
34b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
34c0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
34d0: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
34e0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
34f0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3500: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3510: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3520: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3530: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
3540: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
3550: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3560: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3570: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
3580: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
3590: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
35a0: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
35b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
35d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
35e0: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
35f0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
3600: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
3610: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
3620: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
3630: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
3640: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
3650: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3660: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
3670: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3680: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
3690: 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  erBy,    /* The 
36a0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
36b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
36c0: 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  lect,       /* T
36d0: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
36e0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
36f0: 6e 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20  nt regData      
3700: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
3710: 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74  r holding data t
3720: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29  o be sorted */.)
3730: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
3740: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
3750: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65  nt nExpr = pOrde
3760: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e  rBy->nExpr;.  in
3770: 74 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69  t regBase = sqli
3780: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
3790: 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29  pParse, nExpr+2)
37a0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  ;.  int regRecor
37b0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
37c0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
37d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
37e0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
37f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3800: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
3810: 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  , pOrderBy, regB
3820: 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ase, 0);.  sqlit
3830: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3840: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
3850: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3860: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
3870: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
3880: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
3890: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
38a0: 6e 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73  nExpr+1, 1);.  s
38b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
38c0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
38d0: 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  d, regBase, nExp
38e0: 72 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64  r + 2, regRecord
38f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3900: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
3910: 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79  Insert, pOrderBy
3920: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
3930: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
3940: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
3950: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
3960: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
3970: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
3980: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
3990: 45 78 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70  Expr+2);.  if( p
39a0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29  Select->iLimit )
39b0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
39c0: 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20   addr2;.    int 
39d0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
39e0: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
39f0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
3a00: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
3a10: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
3a20: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
3a30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
3a50: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
3a60: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
3a70: 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  ro, iLimit);.   
3a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3a90: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
3aa0: 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20   iLimit, -1);.  
3ab0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
3ac0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
3ad0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c  P_Goto);.    sql
3ae0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3af0: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
3b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b10: 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f  1(v, OP_Last, pO
3b20: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3b30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3b40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
3b50: 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d  elete, pOrderBy-
3b60: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
3b70: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3b80: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
3b90: 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d     pSelect->iLim
3ba0: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  it = 0;.  }.}../
3bb0: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
3bc0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
3bd0: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
3be0: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
3bf0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
3c00: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
3c10: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
3c20: 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  VM */.  Select *
3c30: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
3c40: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3c50: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
3c60: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
3c70: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
3c80: 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75  e to skip the cu
3c90: 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a  rrent record */.
3ca0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66  ){.  if( p->iOff
3cb0: 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65  set && iContinue
3cc0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  !=0 ){.    int a
3cd0: 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ddr;.    sqlite3
3ce0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3cf0: 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66  _AddImm, p->iOff
3d00: 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64  set, -1);.    ad
3d10: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
3d20: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
3d30: 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b  eg, p->iOffset);
3d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3d50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
3d60: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
3d70: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
3d80: 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53  t((v, "skip OFFS
3d90: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
3da0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3db0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
3dc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3dd0: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
3de0: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
3df0: 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74  ure the N regist
3e00: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
3e10: 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64  iMem.** form a d
3e20: 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20  istinct entry.  
3e30: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
3e40: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
3e50: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
3e60: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
3e70: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
3e80: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
3e90: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
3ea0: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
3eb0: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
3ec0: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
3ed0: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
3ee0: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
3ef0: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
3f00: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
3f10: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
3f20: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
3f30: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
3f40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3f50: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50  odeDistinct(.  P
3f60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3f70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
3f80: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
3f90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
3fa0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
3fb0: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
3fc0: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
3fd0: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
3fe0: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
3ff0: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
4000: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
4010: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
4020: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
4030: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
4040: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
4050: 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20   iMem           
4060: 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74  /* First element
4070: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
4080: 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76  ;.  int r1;..  v
4090: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
40a0: 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
40b0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
40c0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
40d0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
40e0: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
40f0: 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20  drRepeat, iMem, 
4100: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  N);.  sqlite3Vdb
4110: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4120: 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20  keRecord, iMem, 
4130: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
4140: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4150: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
4160: 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  b, r1);.  sqlite
4170: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
4180: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
4190: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
41a0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
41b0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65  ** Generate an e
41c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
41d0: 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73  n a SELECT is us
41e0: 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65  ed within a sube
41f0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78  xpression.** (ex
4200: 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53  ample:  "a IN (S
4210: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
4220: 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73  le)") but it has
4230: 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73   more than 1 res
4240: 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20  ult.** column.  
4250: 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20  We do this in a 
4260: 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75  subroutine becau
4270: 73 65 20 74 68 65 20 65 72 72 6f 72 20 75 73 65  se the error use
4280: 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e  d to occur.** in
4290: 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
42a0: 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e  .  (The error on
42b0: 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65  ly occurs in one
42c0: 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20   place now, but 
42d0: 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65  we.** retain the
42e0: 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d   subroutine to m
42f0: 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73  inimize code dis
4300: 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61  ruption.).*/.sta
4310: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
4320: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
4330: 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20  tError(.  Parse 
4340: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
4350: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e  * Parse context.
4360: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
4370: 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65   *pDest,   /* De
4380: 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c  stination of SEL
4390: 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ECT results */. 
43a0: 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20   int nExpr      
43b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
43c0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
43d0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  s returned by SE
43e0: 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  LECT */.){.  int
43f0: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4400: 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78  eDest;.  if( nEx
4410: 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d  pr>1 && (eDest==
4420: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
4430: 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20  ==SRT_Set) ){.  
4440: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4450: 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
4460: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
4470: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
4480: 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
4490: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
44a0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
44b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
44c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
44d0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  n 0;.  }.}.#endi
44e0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
44f0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
4500: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
4510: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
4520: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
4530: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
4540: 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43  If srcTab and nC
4550: 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a  olumn are both z
4560: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45  ero, then the pE
4570: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
4580: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
4590: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
45a0: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
45b0: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f  his row.  If nCo
45c0: 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64  lumn>0.** then d
45d0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
45e0: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
45f0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
4600: 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20  y to get the.** 
4610: 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65 61  datatypes for ea
4620: 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74  ch column..*/.st
4630: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
4640: 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72  InnerLoop(.  Par
4650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4660: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
4670: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
4680: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
4690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
46a0: 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73  omplete select s
46b0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
46c0: 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  oded */.  ExprLi
46d0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
46e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c    /* List of val
46f0: 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63  ues being extrac
4700: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ted */.  int src
4710: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
4720: 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72   /* Pull data fr
4730: 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  om this table */
4740: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
4750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4760: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
4770: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  in the source ta
4780: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
4790: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
47a0: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
47b0: 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73   sort results us
47c0: 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a  ing this key */.
47d0: 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20    int distinct, 
47e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
47f0: 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72  >=0, make sure r
4800: 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69  esults are disti
4810: 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  nct */.  SelectD
4820: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
4830: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
4840: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
4850: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  s */.  int iCont
4860: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
4870: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
4880: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
4890: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
48a0: 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
48b0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
48c0: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
48d0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
48e0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
48f0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
4900: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
4910: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
4920: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
4930: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
4940: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
4950: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
4960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4970: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
4980: 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  y holding result
4990: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44   set */.  int eD
49a0: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
49b0: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
49c0: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
49d0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
49e0: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  m = pDest->iParm
49f0: 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67  ;   /* First arg
4a00: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
4a10: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
4a20: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
4a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4a40: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
4a50: 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65  lumns */..  asse
4a60: 72 74 28 20 76 20 29 3b 0a 20 20 69 66 28 20 4e  rt( v );.  if( N
4a70: 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
4a80: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
4a90: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61  EList!=0 );.  ha
4aa0: 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74  sDistinct = dist
4ab0: 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66 28 20 70  inct>=0;.  if( p
4ac0: 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68  OrderBy==0 && !h
4ad0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
4ae0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
4af0: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  p, iContinue);. 
4b00: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
4b10: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
4b20: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mns..  */.  if( 
4b30: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
4b40: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43   nResultCol = nC
4b50: 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  olumn;.  }else{.
4b60: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
4b70: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
4b80: 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d    }.  if( pDest-
4b90: 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >iMem==0 ){.    
4ba0: 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 70 50  pDest->iMem = pP
4bb0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
4bc0: 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20    pDest->nMem = 
4bd0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20  nResultCol;.    
4be0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
4bf0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65  nResultCol;.  }e
4c00: 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65 72 74  lse{ .    assert
4c10: 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 3d 3d 6e  ( pDest->nMem==n
4c20: 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 7d  ResultCol );.  }
4c30: 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70  .  regResult = p
4c40: 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66  Dest->iMem;.  if
4c50: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
4c60: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
4c70: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
4c80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c90: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
4ca0: 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65  n, srcTab, i, re
4cb0: 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20  gResult+i);.    
4cc0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
4cd0: 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
4ce0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
4cf0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
4d00: 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65  an EXISTS(...) e
4d10: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61  xpression, the a
4d20: 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c  ctual.    ** val
4d30: 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ues returned by 
4d40: 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e  the SELECT are n
4d50: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
4d60: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
4d70: 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
4d80: 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  arse);.    sqlit
4d90: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4da0: 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
4db0: 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 65 44  t, regResult, eD
4dc0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29  est==SRT_Output)
4dd0: 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20  ;.  }.  nColumn 
4de0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20  = nResultCol;.. 
4df0: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
4e00: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
4e10: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
4e20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
4e30: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
4e40: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
4e50: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
4e60: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
4e70: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
4e80: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
4e90: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
4ea0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
4eb0: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
4ec0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
4ed0: 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e  ->nExpr==nColumn
4ee0: 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74   );.    codeDist
4ef0: 69 6e 63 74 28 70 50 61 72 73 65 2c 20 64 69 73  inct(pParse, dis
4f00: 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  tinct, iContinue
4f10: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65  , nColumn, regRe
4f20: 73 75 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 70  sult);.    if( p
4f30: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
4f40: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4f50: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
4f60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
4f70: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
4f80: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
4f90: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
4fa0: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
4fb0: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
4fc0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
4fd0: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
4fe0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4ff0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
5000: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
5010: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
5020: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
5030: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5040: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5060: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
5070: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
5080: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
5090: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
50a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
50b0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
50c0: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
50d0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
50e0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
50f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5100: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
5110: 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20  struct a record 
5120: 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72  from the query r
5130: 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65  esult, but inste
5140: 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76  ad of.    ** sav
5150: 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c  ing that record,
5160: 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79   use it as a key
5170: 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65   to delete eleme
5180: 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  nts from.    ** 
5190: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
51a0: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
51b0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
51c0: 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73  xcept: {.      s
51d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
51e0: 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  (v, OP_IdxDelete
51f0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75  , iParm, regResu
5200: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
5210: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5220: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
5230: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
5240: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
5250: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
5260: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
5270: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
5280: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
5290: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
52a0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
52b0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
52c0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
52d0: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
52e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
52f0: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
5300: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
5310: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5320: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5330: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
5340: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69  mn, r1);.      i
5350: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
5360: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
5370: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
5380: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
5390: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
53a0: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
53b0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
53c0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
53d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
53e0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
53f0: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
5400: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5410: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
5420: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
5430: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
5440: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5450: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
5460: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
5470: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5480: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
5490: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
54a0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
54b0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
54c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
54d0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
54e0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
54f0: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
5500: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
5510: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
5520: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
5530: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
5540: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
5550: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
5560: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
5570: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
5580: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
5590: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
55a0: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
55b0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
55c0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
55d0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
55e0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==1 );.      p->
55f0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
5600: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
5610: 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y(pEList->a[0].p
5620: 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
5630: 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 69 66  inity);.      if
5640: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
5650: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
5660: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
5670: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
5680: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
5690: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
56a0: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
56b0: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
56c0: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
56d0: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
56e0: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
56f0: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
5700: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
5710: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
5720: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
5730: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
5740: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
5750: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
5760: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
5770: 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  rBy, p, regResul
5780: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
5790: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
57a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
57b0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
57c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
57d0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
57e0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
57f0: 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61  lt, 1, r1, &p->a
5800: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
5810: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5820: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
5830: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
5840: 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20  esult, 1);.     
5850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5860: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
5870: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29  sert, iParm, r1)
5880: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5890: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
58a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
58b0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
58c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
58d0: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
58e0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
58f0: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
5900: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
5910: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5920: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
5930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5940: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
5950: 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  ger, 1, iParm);.
5960: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
5970: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
5980: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
5990: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
59a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
59b0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
59c0: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
59d0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
59e0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
59f0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
5a00: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
5a10: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
5a20: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
5a30: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
5a40: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
5a50: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
5a60: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
5a70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
5a80: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
5a90: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5aa0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
5ab0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
5ac0: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65   pOrderBy, p, re
5ad0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
5ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5af0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
5b00: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ve(pParse, regRe
5b10: 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b  sult, iParm, 1);
5b20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
5b30: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
5b40: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
5b50: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
5b60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5b70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
5b80: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
5b90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5ba0: 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  RY */..    /* Se
5bb0: 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  nd the data to t
5bc0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
5bd0: 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62  tion or to a sub
5be0: 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65  routine.  In the
5bf0: 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20  .    ** case of 
5c00: 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68  a subroutine, th
5c10: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73  e subroutine its
5c20: 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62  elf is responsib
5c30: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f  le for.    ** po
5c40: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66  pping the data f
5c50: 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  rom the stack.. 
5c60: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5c70: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20  RT_Coroutine:.  
5c80: 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75    case SRT_Outpu
5c90: 74 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  t: {.      testc
5ca0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
5cb0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
5cc0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
5cd0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
5ce0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
5cf0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
5d00: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
5d10: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5d20: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
5d30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5d40: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5d50: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
5d60: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  mn, r1);.       
5d70: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5d80: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5d90: 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , p, r1);.      
5da0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5db0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5dc0: 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r1);.      }else
5dd0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
5de0: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
5df0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5e00: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
5e10: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ld, pDest->iParm
5e20: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5e30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5e40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5e50: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
5e60: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  sult, nColumn);.
5e70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5e80: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
5e90: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
5ea0: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5eb0: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
5ec0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5ed0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
5ee0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
5ef0: 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
5f00: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
5f10: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
5f20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
5f30: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
5f40: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
5f50: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
5f60: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
5f70: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
5f80: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
5f90: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
5fa0: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
5fb0: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
5fc0: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
5fd0: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
5fe0: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
5ff0: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
6000: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6010: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
6020: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
6030: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6040: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
6050: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
6060: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
6070: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
6080: 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
6090: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
60a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65     assert( pOrde
60b0: 72 42 79 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 66  rBy==0 );  /* If
60c0: 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
60d0: 45 52 20 42 59 2c 20 74 68 65 20 63 61 6c 6c 20  ER BY, the call 
60e0: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  to.             
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
6100: 2a 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  * pushOntoSorter
6110: 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20 63 6c  () would have cl
6120: 65 61 72 65 64 20 70 2d 3e 69 4c 69 6d 69 74 20  eared p->iLimit 
6130: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
6140: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
6150: 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
6160: 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20  , iBreak, -1);. 
6170: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
6180: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
6190: 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61  list, generate a
61a0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
61b0: 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a  re that records.
61c0: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** the collating
61d0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61   sequence for ea
61e0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
61f0: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
6200: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
6210: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
6220: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
6230: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
6240: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  hen the resultin
6250: 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  g.** KeyInfo str
6260: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
6270: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
6280: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
6290: 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70   index to.** imp
62a0: 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75  lement that clau
62b0: 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72  se.  If the Expr
62c0: 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75  List is the resu
62d0: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
62e0: 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b  CT.** then the K
62f0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
6300: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
6310: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
6320: 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e   a virtual.** in
6330: 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  dex to implement
6340: 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74   a DISTINCT test
6350: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
6360: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
6370: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
6380: 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f  btain from mallo
6390: 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  c.  The calling.
63a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
63b0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73  esponsible for s
63c0: 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  eeing that this 
63d0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
63e0: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
63f0: 2e 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e  .  Add the KeyIn
6400: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
6410: 74 68 65 20 50 34 20 66 69 65 6c 64 20 6f 66 20  the P4 field of 
6420: 61 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a  an opcode using.
6430: 2a 2a 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  ** P4_KEYINFO_HA
6440: 4e 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75  NDOFF is the usu
6450: 61 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e  al way of dealin
6460: 67 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a  g with this..*/.
6470: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
6480: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
6490: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
64a0: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
64b0: 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  st){.  sqlite3 *
64c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
64d0: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
64e0: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
64f0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
6500: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
6510: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
6520: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
6530: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
6540: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
6550: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f  b, sizeof(*pInfo
6560: 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f  ) + nExpr*(sizeo
6570: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29  f(CollSeq*)+1) )
6580: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
6590: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72  .    pInfo->aSor
65a0: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
65b0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70  Info->aColl[nExp
65c0: 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  r];.    pInfo->n
65d0: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 45 78  Field = (u16)nEx
65e0: 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65  pr;.    pInfo->e
65f0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
6600: 20 20 70 49 6e 66 6f 2d 3e 64 62 20 3d 20 64 62    pInfo->db = db
6610: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
6620: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
6630: 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  <nExpr; i++, pIt
6640: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c  em++){.      Col
6650: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
6660: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
6670: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
6680: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
6690: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  pr);.      if( !
66a0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
66b0: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
66c0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
66d0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
66e0: 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
66f0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72       pInfo->aSor
6700: 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65  tOrder[i] = pIte
6710: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
6720: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6730: 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pInfo;.}.../*.*
6740: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
6750: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
6760: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
6770: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
6780: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
6790: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
67a0: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
67b0: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
67c0: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
67d0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
67e0: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
67f0: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
6800: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
6810: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
6820: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
6830: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
6840: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
6850: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
6860: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
6870: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
6880: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
6890: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
68a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
68b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
68c0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
68d0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
68e0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
68f0: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  DBE */.  int nCo
6900: 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75  lumn,      /* Nu
6910: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
6920: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  of data */.  Sel
6930: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f  ectDest *pDest /
6940: 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74  * Write the sort
6950: 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ed results here 
6960: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
6970: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
6980: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
6990: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
69a0: 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a  e to exit loop *
69b0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
69c0: 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
69d0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
69e0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f   /* Jump here fo
69f0: 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  r next cycle */.
6a00: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
6a10: 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73  t iTab;.  int ps
6a20: 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45  eudoTab = 0;.  E
6a30: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
6a40: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
6a50: 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  ..  int eDest = 
6a60: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
6a70: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
6a80: 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74  t->iParm;..  int
6a90: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
6aa0: 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62  egRowid;..  iTab
6ab0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
6ac0: 75 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20  ursor;.  regRow 
6ad0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
6ae0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
6af0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
6b00: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
6b10: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
6b20: 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20      pseudoTab = 
6b30: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
6b40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6b50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
6b60: 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61  Pseudo, pseudoTa
6b70: 62 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  b, regRow, nColu
6b80: 6d 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69  mn);.    regRowi
6b90: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 0;.  }else{.
6ba0: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
6bb0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6bc0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
6bd0: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
6be0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6bf0: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
6c00: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 63 6f 64  ddrBreak);.  cod
6c10: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64  eOffset(v, p, ad
6c20: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73  drContinue);.  s
6c30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6c40: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
6c50: 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  Tab, pOrderBy->n
6c60: 45 78 70 72 20 2b 20 31 2c 20 72 65 67 52 6f 77  Expr + 1, regRow
6c70: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  );.  switch( eDe
6c80: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
6c90: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
6ca0: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
6cb0: 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
6cc0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61  e( eDest==SRT_Ta
6cd0: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ble );.      tes
6ce0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
6cf0: 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20  T_EphemTab );.  
6d00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6d10: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
6d20: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67  owid, iParm, reg
6d30: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
6d40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6d50: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
6d60: 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67  arm, regRow, reg
6d70: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
6d80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6d90: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
6da0: 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ND);.      break
6db0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
6dc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6dd0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52  UERY.    case SR
6de0: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
6df0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
6e00: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
6e10: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
6e20: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
6e30: 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77  egRow, 1, regRow
6e40: 69 64 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79  id, &p->affinity
6e50: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
6e60: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
6e70: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
6e80: 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20  e, regRow, 1);. 
6e90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6ea0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
6eb0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
6ec0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
6ed0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6ee0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
6ef0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
6f00: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
6f10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
6f20: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
6f30: 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29  egRow, iParm, 1)
6f40: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
6f50: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
6f60: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
6f70: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
6f80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6f90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
6fa0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ult: {.      int
6fb0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
6fc0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
6fd0: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
6fe0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a  T_Coroutine ); .
6ff0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7000: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
7010: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
7020: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7030: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
7040: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
7050: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
7060: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
7070: 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d  Row!=pDest->iMem
7080: 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  +i );.        sq
7090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
70a0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73  v, OP_Column, ps
70b0: 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73  eudoTab, i, pDes
70c0: 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20  t->iMem+i);.    
70d0: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
70e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
70f0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
7100: 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
7110: 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  HE);.        }. 
7120: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7130: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
7140: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
7150: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7160: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
7170: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43   pDest->iMem, nC
7180: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
7190: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
71a0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
71b0: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d  Parse, pDest->iM
71c0: 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  em, nColumn);.  
71d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
71e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
71f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
7200: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b  , pDest->iParm);
7210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7220: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
7230: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7240: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
7250: 72 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74  regRow);.  sqlit
7260: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7270: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69  (pParse, regRowi
7280: 64 29 3b 0a 0a 20 20 2f 2a 20 4c 49 4d 49 54 20  d);..  /* LIMIT 
7290: 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65  has been impleme
72a0: 6e 74 65 64 20 62 79 20 74 68 65 20 70 75 73 68  nted by the push
72b0: 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20 72 6f 75  OntoSorter() rou
72c0: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tine..  */.  ass
72d0: 65 72 74 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d  ert( p->iLimit==
72e0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62  0 );..  /* The b
72f0: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
7300: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
7310: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
7320: 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  (v, addrContinue
7330: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
7340: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
7350: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a  t, iTab, addr);.
7360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
7370: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
7380: 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65  rBreak);.  if( e
7390: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
73a0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
73b0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
73c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
73d0: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  2(v, OP_Close, p
73e0: 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20  seudoTab, 0);.  
73f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
7400: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
7410: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
7420: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
7430: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
7440: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
7450: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
7460: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
7470: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
7480: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   caller..**.** T
7490: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
74a0: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
74b0: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
74c0: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
74d0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  rom the.** origi
74e0: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
74f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
7500: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
7510: 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a  a column. The.**
7520: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
7530: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
7540: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20  eld is INTEGER. 
7550: 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20  Exactly when an 
7560: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
7570: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
7580: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70  lumn can be comp
7590: 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65  lex in the prese
75a0: 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65  nce of subquerie
75b0: 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  s. The.** result
75c0: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20  -set expression 
75d0: 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  in all of the fo
75e0: 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73  llowing SELECT s
75f0: 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a  tatements is .**
7600: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
7610: 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e  lumn by this fun
7620: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  ction..**.**   S
7630: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
7640: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
7650: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
7660: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
7670: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
7680: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45  OM tbl);.**   SE
7690: 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53  LECT abc FROM (S
76a0: 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63  ELECT col AS abc
76b0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a   FROM tbl);.** .
76c0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
76d0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20  on type for any 
76e0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72  expression other
76f0: 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69   than a column i
7700: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  s NULL..*/.stati
7710: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
7720: 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65  lumnType(.  Name
7730: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20  Context *pNC, . 
7740: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20   Expr *pExpr,.  
7750: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
7760: 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74  riginDb,.  const
7770: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
7780: 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Tab,.  const cha
7790: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a  r **pzOriginCol.
77a0: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
77b0: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68  *zType = 0;.  ch
77c0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
77d0: 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  nDb = 0;.  char 
77e0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61  const *zOriginTa
77f0: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
7800: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20  nst *zOriginCol 
7810: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
7820: 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d  if( NEVER(pExpr=
7830: 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63  =0) || pNC->pSrc
7840: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
7850: 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   0;..  switch( p
7860: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
7870: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
7880: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
7890: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
78a0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
78b0: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
78c0: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
78d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
78e0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
78f0: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
7900: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
7910: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
7920: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
7930: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
7940: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
7950: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
7960: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
7970: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
7980: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
7990: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
79a0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
79b0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
79c0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
79d0: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
79e0: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
79f0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
7a00: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
7a10: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
7a20: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
7a30: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74   pTab */.      t
7a40: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
7a50: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
7a60: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
7a70: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
7a80: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
7a90: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
7aa0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
7ab0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
7ac0: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
7ad0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
7ae0: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
7af0: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
7b00: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
7b10: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
7b20: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
7b30: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
7b40: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
7b50: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
7b60: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
7b70: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
7b80: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
7b90: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7ba0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
7bb0: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
7bc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
7bd0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7be0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
7bf0: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
7c00: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
7c10: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
7c20: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
7c30: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
7c40: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
7c50: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
7c60: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
7c70: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
7c80: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
7c90: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
7ca0: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
7cb0: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
7cc0: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
7cd0: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
7ce0: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
7cf0: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
7d00: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
7d10: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
7d20: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
7d30: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
7d40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
7d50: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
7d60: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
7d70: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
7d80: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
7d90: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
7da0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
7db0: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
7dc0: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
7dd0: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
7de0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
7df0: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
7e00: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
7e10: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
7e20: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
7e30: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
7e40: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
7e50: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
7e60: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
7e70: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
7e80: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
7e90: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
7ea0: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
7eb0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
7ec0: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
7ed0: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
7ee0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
7ef0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
7f00: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
7f10: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
7f20: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
7f30: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
7f40: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
7f50: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
7f60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7f70: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
7f80: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
7f90: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
7fa0: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
7fb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
7fc0: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
7fd0: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
7fe0: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
7ff0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
8000: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
8010: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
8020: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
8030: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
8040: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
8050: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
8060: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
8070: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
8080: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
8090: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
80a0: 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43  >=0 && ALWAYS(iC
80b0: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
80c0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
80d0: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
80e0: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
80f0: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
8100: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
8110: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
8120: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
8130: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
8140: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
8150: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
8160: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
8170: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
8180: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
8190: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
81a0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
81b0: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
81c0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20  xt sNC;.        
81d0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
81e0: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
81f0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
8200: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
8210: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
8220: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
8230: 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  pNC;.          s
8240: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
8250: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
8260: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
8270: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
8280: 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69  zOriginDb, &zOri
8290: 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e  ginTab, &zOrigin
82a0: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d  Col); .        }
82b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
82c0: 20 41 4c 57 41 59 53 28 70 54 61 62 2d 3e 70 53   ALWAYS(pTab->pS
82d0: 63 68 65 6d 61 29 20 29 7b 0a 20 20 20 20 20 20  chema) ){.      
82e0: 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c    /* A real tabl
82f0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
8300: 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20  ert( !pS );.    
8310: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
8320: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
8330: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Key;.        ass
8340: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
8350: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
8360: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
8370: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
8380: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
8390: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
83a0: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
83b0: 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69  riginCol = "rowi
83c0: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
83d0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
83e0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
83f0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
8400: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f         zOriginCo
8410: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
8420: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
8430: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
8440: 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d  riginTab = pTab-
8450: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
8460: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
8470: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
8480: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
8490: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
84a0: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
84b0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
84c0: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62         zOriginDb
84d0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
84e0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
84f0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  me;.        }.  
8500: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8510: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
8520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
8530: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
8540: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
8550: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
8560: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
8570: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
8580: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
8590: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
85a0: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
85b0: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
85c0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
85d0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
85e0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
85f0: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
8600: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
8610: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
8620: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
8630: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
8640: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
8650: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
8660: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
8670: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8680: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
8690: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
86a0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
86b0: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
86c0: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
86d0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
86e0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
86f0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
8700: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
8710: 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69  zOriginDb, &zOri
8720: 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e  ginTab, &zOrigin
8730: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65  Col); .      bre
8740: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8750: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a  .  }.  .  if( pz
8760: 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20 20  OriginDb ){.    
8770: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69 6e  assert( pzOrigin
8780: 54 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e 43  Tab && pzOriginC
8790: 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  ol );.    *pzOri
87a0: 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44  ginDb = zOriginD
87b0: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  b;.    *pzOrigin
87c0: 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62  Tab = zOriginTab
87d0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43  ;.    *pzOriginC
87e0: 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b  ol = zOriginCol;
87f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54  .  }.  return zT
8800: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
8810: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
8820: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
8830: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
8840: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
8850: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
8860: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
8870: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
8880: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
8890: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
88a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
88b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
88c0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
88d0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
88e0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
88f0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
8900: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
8910: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
8920: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
8930: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
8940: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
8950: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
8960: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
8970: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
8980: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
8990: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
89a0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
89b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
89c0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
89d0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
89e0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
89f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
8a00: 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20   *zType;.#ifdef 
8a10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
8a20: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
8a30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8a40: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63  rigDb = 0;.    c
8a50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
8a60: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Tab = 0;.    con
8a70: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f  st char *zOrigCo
8a80: 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65  l = 0;.    zType
8a90: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
8aa0: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
8ab0: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
8ac0: 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  igCol);..    /* 
8ad0: 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61  The vdbe must ma
8ae0: 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  ke its own copy 
8af0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
8b00: 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20  pe and other .  
8b10: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63    ** column spec
8b20: 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e  ific strings, in
8b30: 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61   case the schema
8b40: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
8b50: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72   this.    ** vir
8b60: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20  tual machine is 
8b70: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
8b80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8b90: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8ba0: 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45  COLNAME_DATABASE
8bb0: 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54  , zOrigDb, SQLIT
8bc0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
8bd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8be0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8bf0: 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72  LNAME_TABLE, zOr
8c00: 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52  igTab, SQLITE_TR
8c10: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
8c20: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8c30: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8c40: 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43  E_COLUMN, zOrigC
8c50: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
8c60: 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20  IENT);.#else.   
8c70: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
8c80: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
8c90: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
8ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8cb0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8cc0: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
8cd0: 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52  zType, SQLITE_TR
8ce0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
8cf0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8d00: 4d 49 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a  MIT_DECLTYPE */.
8d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
8d20: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
8d30: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
8d40: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
8d50: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
8d60: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
8d70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
8d80: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
8d90: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
8da0: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
8db0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
8dc0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
8dd0: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
8de0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8df0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
8e00: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
8e10: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
8e20: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
8e30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8e40: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
8e50: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
8e60: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
8e70: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
8e80: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
8e90: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
8ea0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8eb0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
8ec0: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
8ed0: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
8ee0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
8ef0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
8f00: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
8f10: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
8f20: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
8f30: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
8f40: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
8f50: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
8f60: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45  NamesSet || NEVE
8f70: 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d  R(v==0) || db->m
8f80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
8f90: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
8fa0: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
8fb0: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
8fc0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
8fd0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
8fe0: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
8ff0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
9000: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
9010: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
9020: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
9030: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
9040: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
9050: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
9060: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
9070: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
9080: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
9090: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
90a0: 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
90b0: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
90c0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
90d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
90e0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
90f0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  zName;.      sql
9100: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
9110: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
9120: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
9130: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
9140: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
9150: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
9160: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47   || p->op==TK_AG
9170: 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61  G_COLUMN) && pTa
9180: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
9190: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
91a0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
91b0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
91c0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
91d0: 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53   for(j=0; ALWAYS
91e0: 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  (j<pTabList->nSr
91f0: 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  c); j++){.      
9200: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
9210: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d  a[j].iCursor==p-
9220: 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b  >iTable ) break;
9230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
9240: 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73  ssert( j<pTabLis
9250: 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20  t->nSrc );.     
9260: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
9270: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
9280: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
9290: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
92a0: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
92b0: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
92c0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
92d0: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
92e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
92f0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
9300: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
9310: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
9320: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
9330: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
9340: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9350: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21  !shortNames && !
9360: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
9370: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9380: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
9390: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a   COLNAME_NAME, .
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
93b0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
93c0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
93d0: 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  an), SQLITE_DYNA
93e0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
93f0: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
9400: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
9410: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
9420: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
9430: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
9440: 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
9450: 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ame, zCol);.    
9460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
9470: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
9480: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
9490: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  ame, SQLITE_DYNA
94a0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
94b0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
94c0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
94d0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
94e0: 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54  AME, zCol, SQLIT
94f0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
9500: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
9510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9520: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
9530: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
9540: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
9550: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
9560: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
9570: 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  an), SQLITE_DYNA
9580: 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
9590: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
95a0: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
95b0: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
95c0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
95d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
95e0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61  _SELECT./*.** Na
95f0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
9600: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
9610: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
9620: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
9630: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
9640: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
9650: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
9660: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
9670: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
9680: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
9690: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
96a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
96b0: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
96c0: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
96d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
96e0: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
96f0: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
9700: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
9710: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
9720: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
9730: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
9740: 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  z;.}.#endif /* S
9750: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
9760: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
9770: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20  *.** Given a an 
9780: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
9790: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
97a0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
97b0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
97c0: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
97d0: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
97e0: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
97f0: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
9800: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
9810: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
9820: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
9830: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
9840: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
9850: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
9860: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
9870: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
9880: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
9890: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
98a0: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
98b0: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
98c0: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
98d0: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
98e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
98f0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
9900: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
9910: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
9920: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
9930: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
9940: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
9950: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9960: 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
9970: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
9980: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
9990: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
99a0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
99b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
99c0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
99d0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
99e0: 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
99f0: 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
9a00: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ames */.  int *p
9a10: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
9a20: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
9a30: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9a40: 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
9a50: 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
9a60: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
9a70: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
9a80: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
9a90: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9aa0: 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
9ab0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
9ac0: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
9af0: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  s */.  int cnt; 
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
9b20: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
9b30: 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
9b40: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
9b50: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
9b60: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
9b70: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
9b80: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ba0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
9bb0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
9bc0: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
9bd0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
9be0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
9bf0: 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c  sion for a singl
9c00: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
9c10: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
9c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9c30: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
9c40: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
9c70: 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a   in zName[] */..
9c80: 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20    *pnCol = nCol 
9c90: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
9ca0: 0a 20 20 61 43 6f 6c 20 3d 20 2a 70 61 43 6f 6c  .  aCol = *paCol
9cb0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
9cc0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
9cd0: 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29  f(aCol[0])*nCol)
9ce0: 3b 0a 20 20 69 66 28 20 61 43 6f 6c 3d 3d 30 20  ;.  if( aCol==0 
9cf0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
9d00: 4e 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30  NOMEM;.  for(i=0
9d10: 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e  , pCol=aCol; i<n
9d20: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
9d30: 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  ){.    /* Get an
9d40: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
9d50: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
9d60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
9d70: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
9d80: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
9d90: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  p->pRight==0 || 
9da0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9db0: 70 2d 3e 70 52 69 67 68 74 2c 20 45 50 5f 49 6e  p->pRight, EP_In
9dc0: 74 56 61 6c 75 65 29 0a 20 20 20 20 20 20 20 20  tValue).        
9dd0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70 52 69         || p->pRi
9de0: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30  ght->u.zToken==0
9df0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 75   || p->pRight->u
9e00: 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b  .zToken[0]!=0 );
9e10: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
9e20: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
9e30: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
9e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
9e50: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
9e60: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
9e70: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
9e80: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
9e90: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
9ea0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
9eb0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
9ec0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
9ed0: 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20  olExpr = p;  /* 
9ee0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
9ef0: 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  hat is the resul
9f00: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  t column name */
9f10: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
9f20: 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab;         /* T
9f30: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
9f40: 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73  with this expres
9f50: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68  sion */.      wh
9f60: 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ile( pColExpr->o
9f70: 70 3d 3d 54 4b 5f 44 4f 54 20 29 20 70 43 6f 6c  p==TK_DOT ) pCol
9f80: 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Expr = pColExpr-
9f90: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69  >pRight;.      i
9fa0: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
9fb0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c  =TK_COLUMN && AL
9fc0: 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70  WAYS(pColExpr->p
9fd0: 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Tab!=0) ){.     
9fe0: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
9ff0: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
a000: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
a010: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
a020: 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
a030: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  mn;.        pTab
a040: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
a050: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  b;.        if( i
a060: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
a070: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
a080: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
a090: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
a0a0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
a0b0: 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20        iCol>=0 ? 
a0c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a0d0: 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
a0e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
a0f0: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
a100: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
a110: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
a120: 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
a130: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
a140: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
a150: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
a160: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43  ntf(db, "%s", pC
a170: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
a180: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a190: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
a1a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
a1b0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
a1c0: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
a1d0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
a1e0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
a1f0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
a200: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  , pEList->a[i].z
a210: 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Span);.      }. 
a220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
a230: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
a250: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
a260: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a270: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
a280: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
a290: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
a2a0: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
a2b0: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
a2c0: 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74   ** append a int
a2d0: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
a2e0: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
a2f0: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
a300: 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  */.    nName = s
a310: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
a320: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Name);.    for(j
a330: 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  =cnt=0; j<i; j++
a340: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
a350: 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c  ite3StrICmp(aCol
a360: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [j].zName, zName
a370: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
a380: 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a  char *zNewName;.
a390: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e          zName[nN
a3a0: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ame] = 0;.      
a3b0: 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c    zNewName = sql
a3c0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
a3d0: 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20  "%s:%d", zName, 
a3e0: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
a3f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a400: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
a410: 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61    zName = zNewNa
a420: 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  me;.        j = 
a430: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
a440: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
a450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a460: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
a470: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69  = zName;.  }.  i
a480: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
a490: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
a4a0: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
a4b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
a4c0: 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
a4d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
a4e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a4f0: 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
a500: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
a510: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
a520: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
a530: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
a540: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a550: 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64  .** Add type and
a560: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
a570: 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75  mation to a colu
a580: 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  mn list based on
a590: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
a5a0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54  tement..** .** T
a5b0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70  he column list p
a5c0: 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66  resumably came f
a5d0: 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  rom selectColumn
a5e0: 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73  NamesFromExprLis
a5f0: 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  t()..** The colu
a600: 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79  mn list has only
a610: 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65   names, not type
a620: 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e  s or collations.
a630: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
a640: 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61  e goes through a
a650: 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65  nd adds the type
a660: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
a670: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
a680: 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68  tine requires th
a690: 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65  at all identifie
a6a0: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
a6b0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
a6c0: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74   resolved..*/.st
a6d0: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
a6e0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
a6f0: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
a700: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
a710: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
a720: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ntexts */.  int 
a730: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
a740: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a750: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75  olumns */.  Colu
a760: 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20 20  mn *aCol,       
a770: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
a780: 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  umns */.  Select
a790: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
a7a0: 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
a7b0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
a7c0: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
a7d0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
a7e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a7f0: 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
a800: 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
a810: 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
a820: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
a830: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
a840: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
a850: 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74  em *a;..  assert
a860: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
a870: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
a880: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
a890: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
a8a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  ;.  assert( nCol
a8b0: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
a8c0: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
a8d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a8e0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
a8f0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
a900: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
a910: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
a920: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
a930: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
a940: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
a950: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
a960: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
a970: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43   i<nCol; i++, pC
a980: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61  ol++){.    p = a
a990: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
a9a0: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
a9b0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
a9c0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
a9d0: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a  , p, 0, 0, 0));.
a9e0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
a9f0: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
aa00: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
aa10: 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
aa20: 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
aa30: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
aa40: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70  _AFF_NONE;.    p
aa50: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
aa60: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
aa70: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
aa80: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
aa90: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
aaa0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
aab0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
aac0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
aad0: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
aae0: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
aaf0: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
ab00: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
ab10: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
ab20: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
ab30: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
ab40: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
ab50: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
ab60: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
ab70: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
ab80: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
ab90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
aba0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
abb0: 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
abc0: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
abd0: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
abe0: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
abf0: 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
ac00: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
ac10: 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
ac20: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
ac30: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
ac40: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
ac50: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
ac60: 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  n 0;.  while( pS
ac70: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
ac80: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
ac90: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d  t->pPrior;.  db-
aca0: 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c  >flags = savedFl
acb0: 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ags;.  pTab = sq
acc0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
acd0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
ace0: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
acf0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
ad00: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  rn 0;.  }.  /* T
ad10: 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  he sqlite3Result
ad20: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73  SetOfSelect() is
ad30: 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e   only used n con
ad40: 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b  texts where look
ad50: 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69  aside.  ** is di
ad60: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65  sabled */.  asse
ad70: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
ad80: 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b  e.bEnabled==0 );
ad90: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
ada0: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
adb0: 20 3d 20 30 3b 0a 20 20 73 65 6c 65 63 74 43 6f   = 0;.  selectCo
adc0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
add0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
ade0: 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
adf0: 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
ae00: 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64  Col);.  selectAd
ae10: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
ae20: 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
ae30: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62  pTab->nCol, pTab
ae40: 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 65 63 74 29  ->aCol, pSelect)
ae50: 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
ae60: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e  = -1;.  if( db->
ae70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
ae80: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
ae90: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
aea0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
aeb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
aec0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  b;.}../*.** Get 
aed0: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
aee0: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
aef0: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
af00: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
af10: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
af20: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
af30: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
af40: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
af50: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
af60: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
af70: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
af80: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
af90: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
afa0: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
afb0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
afc0: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
afd0: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23  e(pParse->db);.#
afe0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aff0: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28  IT_TRACE.    if(
b000: 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69   v ){.      sqli
b010: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
b020: 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20 20 20   OP_Trace);.    
b030: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  }.#endif.  }.  r
b040: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn v;.}.../*.
b050: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
b060: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
b070: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
b080: 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
b090: 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
b0a0: 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
b0b0: 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
b0c0: 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
b0d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
b0e0: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
b0f0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
b100: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
b110: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
b120: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
b130: 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
b140: 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
b150: 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
b160: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
b170: 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
b180: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
b190: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
b1a0: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
b1b0: 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
b1c0: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
b1d0: 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
b1e0: 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
b1f0: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
b200: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
b210: 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
b220: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b230: 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
b240: 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
b250: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
b260: 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
b270: 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
b280: 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
b290: 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
b2a0: 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
b2b0: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
b2c0: 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
b2d0: 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
b2e0: 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73  lt values.** (us
b2f0: 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c  ually but not al
b300: 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74  ways -1) prior t
b310: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
b320: 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20  outine..** Only 
b330: 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20  if pLimit!=0 or 
b340: 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68  pOffset!=0 do th
b350: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
b360: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
b370: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
b380: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
b390: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
b3a0: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
b3b0: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
b3c0: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
b3d0: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
b3e0: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
b3f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
b400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b410: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
b420: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
b430: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
b440: 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
b450: 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
b460: 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
b470: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
b480: 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20  int addr1, n;.  
b490: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
b4a0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
b4b0: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
b4c0: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
b4d0: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
b4e0: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61  some.  ** contra
b4f0: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
b500: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
b510: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
b520: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
b530: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
b540: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
b550: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
b560: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
b570: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
b580: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
b590: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
b5a0: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Offset==0 || p->
b5b0: 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  pLimit!=0 );.  i
b5c0: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
b5d0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
b5e0: 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
b5f0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
b600: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
b610: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
b620: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
b630: 65 74 75 72 6e 3b 20 20 2f 2a 20 56 44 42 45 20  eturn;  /* VDBE 
b640: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
b650: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
b660: 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  ed */.    if( sq
b670: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
b680: 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e  er(p->pLimit, &n
b690: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
b6a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b6b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69  OP_Integer, n, i
b6c0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
b6d0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
b6e0: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
b6f0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
b700: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b710: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b720: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
b730: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
b740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
b750: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
b760: 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  arse, p->pLimit,
b770: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
b780: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b790: 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
b7a0: 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
b7b0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
b7c0: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
b7d0: 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
b7e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b7f0: 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69  OP_IfZero, iLimi
b800: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
b810: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66  }.    if( p->pOf
b820: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  fset ){.      p-
b830: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
b840: 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
b850: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
b860: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
b870: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
b880: 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
b890: 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
b8a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b8b0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
b8c0: 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  pOffset, iOffset
b8d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b8e0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
b8f0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66  _MustBeInt, iOff
b900: 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
b910: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
b920: 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
b930: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
b940: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b950: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
b960: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
b970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b980: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
b990: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
b9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b9b0: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
b9c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b9d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
b9e0: 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73  d, iLimit, iOffs
b9f0: 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  et, iOffset+1);.
ba00: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
ba10: 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46  t((v, "LIMIT+OFF
ba20: 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64  SET"));.      ad
ba30: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
ba40: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
ba50: 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  Pos, iLimit);.  
ba60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ba70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
ba80: 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74  ger, -1, iOffset
ba90: 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
baa0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
bab0: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a  , addr1);.    }.
bac0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
bad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
bae0: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
baf0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
bb00: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
bb10: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
bb20: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
bb30: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
bb40: 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
bb50: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
bb60: 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
bb70: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
bb80: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
bb90: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
bba0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
bbb0: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
bbc0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
bbd0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
bbe0: 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
bbf0: 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
bc00: 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
bc10: 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
bc20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
bc30: 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
bc40: 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
bc50: 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
bc60: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
bc70: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
bc80: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
bc90: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
bca0: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
bcb0: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
bcc0: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
bcd0: 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
bce0: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
bcf0: 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
bd00: 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66   iCol>=0 );.  if
bd10: 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43 6f  ( pRet==0 && iCo
bd20: 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
bd30: 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  pr ){.    pRet =
bd40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
bd50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
bd60: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
bd70: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
bd80: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
bd90: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
bda0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
bdb0: 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  T */../* Forward
bdc0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
bdd0: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
bde0: 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
bdf0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
be00: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
be10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
be20: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
be30: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
be40: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
be50: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
be60: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
be70: 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
be80: 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
be90: 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a  results */.);...
bea0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
beb0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
bec0: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
bed0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
bee0: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
bef0: 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
bf00: 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
bf10: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
bf20: 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
bf30: 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
bf40: 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
bf50: 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
bf60: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
bf70: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
bf80: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
bf90: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
bfa0: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
bfb0: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
bfc0: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
bfd0: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
bfe0: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
bff0: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
c000: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
c010: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
c020: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
c030: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
c040: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
c050: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
c060: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
c070: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
c080: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
c090: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
c0a0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
c0b0: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
c0c0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
c0d0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
c0e0: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
c0f0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
c100: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
c110: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
c120: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
c130: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
c140: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
c150: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
c160: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
c170: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
c180: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
c1b0: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
c1c0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
c1d0: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
c1e0: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
c1f0: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
c200: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
c210: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
c220: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
c230: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
c240: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
c250: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
c260: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
c270: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
c280: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
c290: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
c2a0: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
c2b0: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
c2c0: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
c2d0: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
c2e0: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
c2f0: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
c300: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
c310: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
c320: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
c330: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
c340: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c350: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
c360: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
c370: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
c380: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
c390: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
c3a0: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
c3b0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
c3c0: 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
c3d0: 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
c3e0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
c3f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c400: 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
c410: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
c420: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
c430: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
c440: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
c450: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
c460: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
c470: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
c480: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
c490: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
c4a0: 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
c4b0: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
c4c0: 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
c4d0: 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
c4e0: 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
c4f0: 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20  Delete = 0;  /* 
c500: 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20  Chain of simple 
c510: 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74  selects to delet
c520: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
c530: 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
c540: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
c550: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b  ion */..  /* Mak
c560: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
c570: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
c580: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
c590: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
c5a0: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
c5b0: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
c5c0: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
c5d0: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
c5e0: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
c5f0: 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
c600: 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
c610: 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
c620: 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
c630: 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
c640: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
c650: 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
c660: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
c670: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
c680: 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29  htmost!=pPrior )
c690: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
c6a0: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d  or->pRightmost==
c6b0: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b  p->pRightmost );
c6c0: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
c6d0: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
c6e0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
c6f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c700: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
c710: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
c720: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
c730: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
c740: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
c750: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
c760: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
c770: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
c780: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
c790: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
c7a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c7b0: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
c7c0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
c7d0: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
c7e0: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
c7f0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
c800: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
c810: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c820: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
c830: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c840: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
c850: 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
c860: 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
c870: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
c880: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
c890: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
c8a0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
c8b0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
c8c0: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
c8d0: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
c8e0: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
c8f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
c900: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
c910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c920: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
c930: 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c  ral, dest.iParm,
c940: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
c950: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
c960: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
c970: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
c980: 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
c990: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
c9a0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
c9b0: 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
c9c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
c9d0: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
c9e0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
c9f0: 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
ca00: 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
ca10: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
ca20: 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
ca30: 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
ca40: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
ca50: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
ca60: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
ca70: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ca80: 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
ca90: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
caa0: 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
cab0: 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
cac0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
cad0: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
cae0: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
caf0: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
cb00: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
cb10: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
cb20: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75    }..  /* Compou
cb30: 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20  nd SELECTs that 
cb40: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
cb50: 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64   clause are hand
cb60: 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  led separately..
cb70: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f    */.  if( p->pO
cb80: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
cb90: 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
cba0: 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20  OrderBy(pParse, 
cbb0: 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  p, pDest);.  }..
cbc0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
cbd0: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
cbe0: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
cbf0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
cc00: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
cc10: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
cc20: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ALL: {.      in
cc30: 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
cc40: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
cc50: 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
cc60: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
cc70: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
cc80: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
cc90: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
cca0: 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  t;.      rc = sq
ccb0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
ccc0: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
ccd0: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
cce0: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
ccf0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
cd00: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
cd10: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
cd20: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
cd30: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
cd40: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
cd50: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
cd60: 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
cd70: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
cd80: 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
cd90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
cda0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
cdb0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
cdc0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
cdd0: 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
cde0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
cdf0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
ce00: 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
ce10: 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
ce20: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
ce30: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
ce40: 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
ce50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ce60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
ce70: 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
ce80: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
ce90: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
cea0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
ceb0: 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
cec0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ced0: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
cee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
cef0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
cf00: 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
cf10: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
cf20: 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
cf30: 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
cf40: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
cf50: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
cf60: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
cf70: 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d  */.      u8 op =
cf80: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
cf90: 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
cfa0: 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
cfb0: 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
cfc0: 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
cfd0: 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
cfe0: 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
cff0: 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
d000: 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
d010: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
d020: 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
d030: 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
d040: 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
d050: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
d060: 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
d070: 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
d080: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d090: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
d0a0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
d0b0: 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
d0c0: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ION );.      pri
d0d0: 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
d0e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
d0f0: 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
d100: 26 26 20 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c  && ALWAYS(!p->pL
d110: 69 6d 69 74 20 26 26 21 70 2d 3e 70 4f 66 66 73  imit &&!p->pOffs
d120: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  et) ){.        /
d130: 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
d140: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d150: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
d160: 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
d170: 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
d180: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
d190: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
d1a0: 69 67 68 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20  ightmost!=p );  
d1b0: 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70  /* Can only happ
d1c0: 65 6e 20 66 6f 72 20 6c 65 66 74 77 61 72 64 20  en for leftward 
d1d0: 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 20  elements.       
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
d200: 20 6f 66 20 61 20 33 2d 77 61 79 20 6f 72 20 6d   of a 3-way or m
d210: 6f 72 65 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a  ore compound */.
d220: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d230: 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
d240: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
d250: 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
d260: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
d270: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d280: 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
d290: 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
d2a0: 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
d2b0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
d2c0: 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
d2d0: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
d2e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
d2f0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
d300: 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
d310: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
d320: 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
d330: 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
d340: 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
d350: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
d360: 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
d370: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
d380: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
d390: 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
d3a0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d3b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d3c0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
d3d0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
d3e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d3f0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
d400: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
d410: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
d420: 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
d430: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
d440: 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ost->selFlags |=
d450: 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
d460: 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
d470: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
d480: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
d490: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
d4a0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
d4b0: 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
d4c0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
d4d0: 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
d4e0: 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
d4f0: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
d500: 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
d510: 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
d520: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d530: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
d540: 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
d550: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
d560: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
d570: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d580: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
d590: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
d5a0: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
d5b0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
d5c0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
d5d0: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
d5e0: 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
d5f0: 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
d600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
d610: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
d620: 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
d630: 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
d640: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d650: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
d660: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
d670: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
d680: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
d690: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
d6a0: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
d6b0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
d6c0: 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
d6d0: 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
d6e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
d6f0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
d700: 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
d710: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
d720: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
d730: 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
d740: 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
d750: 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
d760: 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
d770: 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
d780: 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
d790: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
d7a0: 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
d7b0: 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
d7c0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
d7d0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
d7e0: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
d7f0: 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
d800: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
d810: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
d820: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
d830: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
d840: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
d850: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
d860: 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
d870: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
d880: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
d890: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
d8a0: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->iLimit = 0;.
d8b0: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
d8c0: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
d8d0: 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
d8e0: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
d8f0: 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
d900: 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
d910: 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
d920: 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
d930: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d940: 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61   assert( unionTa
d950: 62 3d 3d 64 65 73 74 2e 69 50 61 72 6d 20 7c 7c  b==dest.iParm ||
d960: 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
d970: 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66  orOp );.      if
d980: 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  ( dest.eDest!=pr
d990: 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
d9a0: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
d9b0: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
d9c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d9d0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
d9e0: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
d9f0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
da00: 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
da10: 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
da20: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
da30: 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
da40: 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
da50: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
da60: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
da70: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
da80: 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
da90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
daa0: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
dab0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
dac0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
dad0: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
dae0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
daf0: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
db00: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
db10: 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
db20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
db30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
db40: 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
db50: 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  b, iBreak);.    
db60: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
db70: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
db80: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
db90: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
dba0: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
dbb0: 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  List, unionTab, 
dbc0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
dbd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dbe0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c            0, -1,
dbf0: 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
dc00: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
dc10: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
dc20: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
dc30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
dc40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dc50: 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61  OP_Next, unionTa
dc60: 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  b, iStart);.    
dc70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
dc80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
dc90: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
dca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dcb0: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
dcc0: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
dcd0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
dce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
dcf0: 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e  ult: assert( p->
dd00: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
dd10: 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
dd20: 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
dd30: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
dd40: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
dd50: 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
dd60: 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20   *pOffset;.     
dd70: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
dd80: 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65   SelectDest inte
dd90: 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20  rsectdest;.     
dda0: 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20   int r1;..      
ddb0: 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
ddc0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
ddd0: 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
dde0: 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
ddf0: 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
de00: 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
de10: 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
de20: 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
de30: 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
de40: 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
de50: 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
de60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
de70: 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
de80: 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
de90: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
dea0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
deb0: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
dec0: 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
ded0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dee0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
def0: 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
df00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
df10: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
df20: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
df30: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
df40: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
df50: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
df60: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
df70: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
df80: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
df90: 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
dfa0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
dfb0: 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
dfc0: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
dfd0: 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
dfe0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
dff0: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
e000: 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  t(&intersectdest
e010: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
e020: 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
e030: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
e040: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
e050: 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
e060: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
e070: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
e080: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
e090: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
e0a0: 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
e0b0: 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70  SELECT into temp
e0c0: 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
e0d0: 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  2".      */.    
e0e0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
e0f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e100: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
e110: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
e120: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
e130: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
e140: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
e150: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61  rOpenEphm[1] = a
e160: 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ddr;.      p->pP
e170: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
e180: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
e190: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
e1a0: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
e1b0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
e1c0: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
e1d0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
e1e0: 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
e1f0: 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20  Parm = tab2;.   
e200: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
e210: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
e220: 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
e230: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e240: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e250: 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
e260: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
e270: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
e280: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71  pPrior;.      sq
e290: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
e2a0: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
e2b0: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
e2c0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
e2d0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
e2e0: 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  fset;..      /* 
e2f0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
e300: 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
e310: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
e320: 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
e330: 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
e340: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
e350: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
e360: 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
e370: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
e380: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c  t ){.        Sel
e390: 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
e3a0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
e3b0: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
e3c0: 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
e3d0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
e3e0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
e3f0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
e400: 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
e410: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e420: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
e430: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
e440: 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
e450: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
e460: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63  abel(v);.      c
e470: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
e480: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
e490: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
e4a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e4b0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
e4c0: 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ab1, iBreak);.  
e4d0: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
e4e0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
e4f0: 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
e500: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e510: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  dOp2(v, OP_RowKe
e520: 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  y, tab1, r1);.  
e530: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e540: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
e550: 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
e560: 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20  Cont, r1, 0);.  
e570: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
e580: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
e590: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c  , r1);.      sel
e5a0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
e5b0: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
e5c0: 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69  t, tab1, p->pELi
e5d0: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5f0: 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69   0, -1, &dest, i
e600: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
e610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e620: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
e630: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
e640: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e650: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
e660: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
e670: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
e680: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
e690: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
e6a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e6b0: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
e6c0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
e6d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e6e0: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
e6f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e700: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e710: 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
e720: 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
e730: 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   by .  ** tempor
e740: 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
e750: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
e760: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
e770: 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
e780: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
e790: 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
e7a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20  porary tables.. 
e7b0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
e7c0: 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
e7d0: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
e7e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
e7f0: 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
e800: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
e810: 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
e820: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
e830: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
e840: 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
e850: 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
e860: 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
e870: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
e880: 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
e890: 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
e8a0: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
e8b0: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
e8c0: 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  & SF_UsesEphemer
e8d0: 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
e900: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
e910: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
e920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e930: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
e940: 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
e950: 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c  t set */.    Sel
e960: 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  ect *pLoop;     
e970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
e980: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
e990: 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
e9a0: 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  nts */.    CollS
e9b0: 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
e9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
e9d0: 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
e9e0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
e9f0: 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ] */.    int nCo
ea00: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
ea10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ea20: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72   of columns in r
ea30: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
ea40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
ea50: 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20  ghtmost==p );.  
ea60: 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
ea70: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  st->nExpr;.    p
ea80: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
ea90: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
eaa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
eab0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
eac0: 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a  *pKeyInfo)+nCol*
ead0: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
eae0: 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28  ) + 1));.    if(
eaf0: 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
eb00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
eb10: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
eb20: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
eb30: 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  nd;.    }..    p
eb40: 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45  KeyInfo->enc = E
eb50: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 4b 65 79  NC(db);.    pKey
eb60: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28  Info->nField = (
eb70: 75 31 36 29 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66  u16)nCol;..    f
eb80: 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
eb90: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
eba0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
ebb0: 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
ebc0: 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
ebd0: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
ebe0: 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
ebf0: 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
ec00: 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
ec10: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
ec20: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
ec30: 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
ec40: 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
ec50: 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
ec60: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ec70: 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
ec80: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
ec90: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
eca0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
ecb0: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
ecc0: 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
ecd0: 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
ece0: 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
ecf0: 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
ed00: 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
ed10: 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
ed20: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
ed30: 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
ed40: 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
ed50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
ed60: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
ed70: 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
ed80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ed90: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
eda0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
edb0: 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
edc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
edd0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
ede0: 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79  ddr, (char*)pKey
edf0: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
ee00: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
ee10: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
ee20: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
ee30: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ee40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79  3DbFree(db, pKey
ee50: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
ee60: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
ee70: 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64 65  pDest->iMem = de
ee80: 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73 74  st.iMem;.  pDest
ee90: 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e 4d  ->nMem = dest.nM
eea0: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  em;.  sqlite3Sel
eeb0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
eec0: 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  elete);.  return
eed0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
eee0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
eef0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
ef00: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
ef10: 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
ef20: 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
ef30: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
ef40: 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
ef50: 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
ef60: 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
ef70: 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
ef80: 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20  d in pIn->iMem. 
ef90: 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
efa0: 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20  n->nMem columns 
efb0: 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70  to be output.  p
efc0: 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68  Dest is where th
efd0: 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a  e output should.
efe0: 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a  ** be sent..**.*
eff0: 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74  * regReturn is t
f000: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
f010: 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
f020: 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
f030: 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65  .** return addre
f040: 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  ss..**.** If reg
f050: 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69  Prev>0 then it i
f060: 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  s the first regi
f070: 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72  ster in a vector
f080: 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73   that.** records
f090: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75   the previous ou
f0a0: 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72  tput.  mem[regPr
f0b0: 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68  ev] is a flag th
f0c0: 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69  at is false.** i
f0d0: 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
f0e0: 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74   no previous out
f0f0: 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76  put.  If regPrev
f100: 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a  >0 then code is.
f110: 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  ** generated to 
f120: 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  suppress duplica
f130: 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69  tes.  pKeyInfo i
f140: 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61  s used for compa
f150: 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a  ring.** keys..**
f160: 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54  .** If the LIMIT
f170: 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69   found in p->iLi
f180: 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20  mit is reached, 
f190: 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
f1a0: 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a   to.** iBreak..*
f1b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e  /.static int gen
f1c0: 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
f1d0: 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a  utine(.  Parse *
f1e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
f1f0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
f200: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
f210: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
f220: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
f230: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65  tatement */.  Se
f240: 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20  lectDest *pIn,  
f250: 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69        /* Corouti
f260: 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74  ne supplying dat
f270: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
f280: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
f290: 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20  * Where to send 
f2a0: 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
f2b0: 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20  t regReturn,    
f2c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
f2d0: 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
f2e0: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
f2f0: 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  gPrev,          
f300: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65    /* Previous re
f310: 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20  sult register.  
f320: 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66  No uniqueness if
f330: 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20   0 */.  KeyInfo 
f340: 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
f350: 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67  /* For comparing
f360: 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65   with previous e
f370: 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 34  ntry */.  int p4
f380: 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
f390: 20 20 2f 2a 20 54 68 65 20 70 34 20 74 79 70 65    /* The p4 type
f3a0: 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f 20 2a 2f   for pKeyInfo */
f3b0: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
f3c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
f3d0: 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
f3e0: 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
f3f0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
f400: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
f410: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
f420: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
f430: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
f440: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
f450: 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
f460: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
f470: 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
f480: 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
f490: 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
f4a0: 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
f4b0: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
f4c0: 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
f4d0: 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d  j1, j2;.    j1 =
f4e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f4f0: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
f500: 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 6a 32  regPrev);.    j2
f510: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f520: 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
f530: 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72  re, pIn->iMem, r
f540: 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
f550: 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
f580: 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 20  fo, p4type);.   
f590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f5a0: 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
f5b0: 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  2+2, iContinue, 
f5c0: 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  j2+2);.    sqlit
f5d0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
f5e0: 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , j1);.    sqlit
f5f0: 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70  e3ExprCodeCopy(p
f600: 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
f610: 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
f620: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c  ->nMem);.    sql
f630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f640: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
f650: 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20   regPrev);.  }. 
f660: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
f670: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
f680: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
f690: 53 75 70 70 72 65 73 73 20 74 68 65 20 74 68 65  Suppress the the
f6a0: 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e   first OFFSET en
f6b0: 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69  tries if there i
f6c0: 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  s an OFFSET clau
f6d0: 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66  se.  */.  codeOf
f6e0: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
f6f0: 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68  inue);..  switch
f700: 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29  ( pDest->eDest )
f710: 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  {.    /* Store t
f720: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
f730: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
f740: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
f750: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
f760: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
f770: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
f780: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
f790: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
f7a0: 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32  e);.      int r2
f7b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f7c0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
f7d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
f7e0: 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
f7f0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
f800: 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e  estcase( pDest->
f810: 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
f820: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  Tab );.      sql
f830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f840: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
f850: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d   pIn->iMem, pIn-
f860: 3e 6e 4d 65 6d 2c 20 72 31 29 3b 0a 20 20 20 20  >nMem, r1);.    
f870: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f880: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
f890: 69 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  id, pDest->iParm
f8a0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
f8b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f8c0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65  , OP_Insert, pDe
f8d0: 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31 2c 20 72  st->iParm, r1, r
f8e0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
f8f0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
f900: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
f910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
f920: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
f930: 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
f940: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f950: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
f960: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f970: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
f980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
f990: 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
f9a0: 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
f9b0: 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
f9c0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
f9d0: 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
f9e0: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
f9f0: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
fa00: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
fa10: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
fa20: 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
fa30: 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
fa40: 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
fa50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
fa60: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
fa70: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
fa80: 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65  assert( pIn->nMe
fa90: 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  m==1 );.      p-
faa0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 0a 20 20 20  >affinity = .   
fab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
fac0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e  pareAffinity(p->
fad0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
fae0: 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e  pr, pDest->affin
faf0: 69 74 79 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  ity);.      r1 =
fb00: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
fb10: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
fb20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fb30: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
fb40: 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  cord, pIn->iMem,
fb50: 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69   1, r1, &p->affi
fb60: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
fb70: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
fb80: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
fb90: 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
fba0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
fbb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fbc0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
fbd0: 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31 29  Dest->iParm, r1)
fbe0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
fbf0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
fc00: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
fc10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
fc20: 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f  if 0  /* Never o
fc30: 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45  ccurs on an ORDE
fc40: 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20  R BY query */.  
fc50: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
fc60: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
fc70: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
fc80: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
fc90: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
fca0: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
fcb0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
fcc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fcd0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65  _Integer, 1, pDe
fce0: 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20  st->iParm);.    
fcf0: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
fd00: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
fd10: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
fd20: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
fd30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
fd40: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  f..    /* If thi
fd50: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
fd60: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
fd70: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
fd80: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
fd90: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
fda0: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
fdb0: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
fdc0: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
fdd0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
fde0: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
fdf0: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
fe00: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
fe10: 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b   pIn->nMem==1 );
fe20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fe30: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
fe40: 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44  e, pIn->iMem, pD
fe50: 65 73 74 2d 3e 69 50 61 72 6d 2c 20 31 29 3b 0a  est->iParm, 1);.
fe60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
fe70: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
fe80: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
fe90: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
fea0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
feb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
fec0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
fed0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
fee0: 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
fef0: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
ff00: 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
ff10: 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
ff20: 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
ff30: 4d 65 6d 2e 20 20 54 68 65 6e 20 74 68 65 20 63  Mem.  Then the c
ff40: 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
ff50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
ff60: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
ff70: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
ff80: 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20  st->iMem==0 ){. 
ff90: 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 4d         pDest->iM
ffa0: 65 6d 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  em = sqlite3GetT
ffb0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
ffc0: 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20   pIn->nMem);.   
ffd0: 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d       pDest->nMem
ffe0: 20 3d 20 70 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20   = pIn->nMem;.  
fff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
10000 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
10010 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
10020 6d 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20  m, pDest->iMem, 
10030 70 44 65 73 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  pDest->nMem);.  
10040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10050 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
10060 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29  d, pDest->iParm)
10070 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10080 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
10090 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76  none of the abov
100a0 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  e, then the resu
100b0 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d  lt destination m
100c0 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52  ust be.    ** SR
100d0 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20  T_Output.  This 
100e0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
100f0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79   called with any
10100 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65   other.    ** de
10110 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20  stination other 
10120 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61  than the ones ha
10130 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53  ndled above or S
10140 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a  RT_Output..    *
10150 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54  *.    ** For SRT
10160 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73  _Output, results
10170 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
10180 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
10190 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a  isters.  .    **
101a0 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73   Then the OP_Res
101b0 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73  ultRow opcode is
101c0 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73   used to cause s
101d0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f  qlite3_step() to
101e0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  .    ** return t
101f0 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72  he next row of r
10200 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  esult..    */.  
10210 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
10220 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
10230 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
10240 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  put );.      sql
10250 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10260 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
10270 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e  pIn->iMem, pIn->
10280 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  nMem);.      sql
10290 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
102a0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
102b0 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70  se, pIn->iMem, p
102c0 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  In->nMem);.     
102d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
102e0 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
102f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
10300 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
10310 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
10320 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
10330 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
10340 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10350 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
10360 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b  it, iBreak, -1);
10370 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
10380 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
10390 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
103a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
103b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
103c0 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
103d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
103e0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
103f0 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
10400 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
10410 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
10420 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
10430 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
10440 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
10450 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
10460 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
10470 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
10480 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
10490 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
104a0 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
104b0 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
104c0 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
104d0 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
104e0 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
104f0 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
10500 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
10510 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
10520 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
10530 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
10540 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
10550 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
10560 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
10570 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
10580 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
10590 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
105a0 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
105b0 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
105c0 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
105d0 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
105e0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
105f0 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
10600 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
10610 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
10620 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
10630 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
10640 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
10650 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
10660 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
10670 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
10680 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
10690 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
106a0 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
106b0 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
106c0 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
106d0 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
106e0 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
106f0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
10700 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
10710 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
10720 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
10730 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
10740 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
10750 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
10760 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
10770 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
10780 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
10790 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
107a0 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
107b0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
107c0 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
107d0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
107e0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
107f0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
10800 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
10810 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
10820 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
10830 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
10840 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
10850 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
10860 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
10870 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
10880 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
10890 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
108a0 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
108b0 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
108c0 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
108d0 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
108e0 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
108f0 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
10900 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
10910 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
10920 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
10930 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
10940 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
10950 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
10960 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
10970 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
10980 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
10990 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
109a0 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
109b0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
109c0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
109d0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
109e0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
109f0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
10a00 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
10a10 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
10a20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
10a30 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
10a40 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
10a50 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
10a60 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
10a70 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
10a80 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
10a90 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
10aa0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
10ab0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
10ac0 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
10ad0 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
10ae0 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
10af0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
10b00 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
10b10 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
10b20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
10b30 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
10b40 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
10b50 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
10b60 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
10b70 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
10b80 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
10b90 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
10ba0 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
10bb0 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
10bc0 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
10bd0 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
10be0 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
10bf0 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
10c00 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
10c10 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
10c20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
10c30 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
10c40 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
10c50 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
10c60 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
10c70 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
10c80 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
10c90 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
10ca0 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
10cb0 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
10cc0 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
10cd0 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
10ce0 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
10cf0 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
10d00 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
10d10 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
10d20 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
10d30 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
10d40 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
10d50 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
10d60 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
10d70 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
10d80 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
10d90 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
10da0 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
10db0 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
10dc0 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
10dd0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
10de0 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
10df0 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
10e00 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
10e10 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
10e20 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
10e30 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
10e40 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
10e50 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
10e60 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
10e70 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
10e80 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
10e90 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
10ea0 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
10eb0 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
10ec0 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
10ed0 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
10ee0 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
10ef0 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
10f00 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
10f10 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
10f20 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
10f30 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
10f40 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
10f50 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
10f60 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
10f70 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
10f80 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
10f90 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
10fa0 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
10fb0 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
10fc0 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
10fd0 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
10fe0 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
10ff0 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
11000 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
11010 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
11020 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
11030 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
11040 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
11050 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
11060 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
11070 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
11080 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
11090 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
110a0 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
110b0 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
110c0 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
110d0 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
110e0 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
110f0 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
11100 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
11110 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
11120 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
11130 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
11140 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
11150 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
11160 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
11170 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11180 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
11190 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
111a0 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
111b0 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
111c0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
111d0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
111e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
111f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11200 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
11210 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
11220 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
11230 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
11240 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
11250 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
11260 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
11270 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
11280 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
11290 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
112a0 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
112b0 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
112c0 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
112d0 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
112e0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
112f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
11300 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
11310 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
11320 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
11330 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
11340 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
11350 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
11360 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
11370 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
11380 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
11390 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
113a0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
113b0 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
113c0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
113d0 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20   regEofA;       
113e0 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e     /* Flag to in
113f0 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65  dicate when sele
11400 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65  ct-A is complete
11410 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
11420 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
11430 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
11440 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
11450 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
11460 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20  regEofB;        
11470 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64    /* Flag to ind
11480 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63  icate when selec
11490 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20  t-B is complete 
114a0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
114b0 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
114c0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
114d0 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
114e0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
114f0 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
11500 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
11510 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
11520 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
11530 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
11540 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
11550 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
11560 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
11570 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
11580 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
11590 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
115a0 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
115b0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
115c0 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
115d0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
115e0 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
115f0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
11600 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20  addrOutB = 0;   
11610 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
11620 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
11630 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
11640 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
11650 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
11660 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
11670 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
11680 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
11690 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
116a0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
116b0 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
116c0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
116d0 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
116e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
116f0 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
11700 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
11710 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
11720 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
11730 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
11740 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
11750 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
11760 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
11770 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
11780 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
11790 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
117a0 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
117b0 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
117c0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
117d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
117e0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
117f0 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
11800 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
11810 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
11820 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
11830 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
11840 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
11850 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
11860 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
11870 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
11880 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
11890 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
118a0 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
118b0 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
118c0 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
118d0 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
118e0 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
118f0 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
11900 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
11910 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
11920 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
11930 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
11940 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31  stmt */.  int j1
11950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11960 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
11970 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
11980 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
11990 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
119a0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
119b0 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
119c0 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
119d0 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
119e0 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
119f0 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
11a00 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
11a10 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
11a20 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
11a30 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
11a40 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
11a50 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
11a60 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
11a70 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
11a80 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
11a90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
11aa0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
11ab0 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
11ac0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
11ad0 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
11ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11af0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
11b00 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11b10 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
11b20 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
11b30 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
11b40 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
11b50 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
11b60 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ns */..  assert(
11b70 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
11b80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
11b90 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
11ba0 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
11bb0 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
11bc0 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
11bd0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11be0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
11bf0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
11c00 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  0 );       /* Al
11c10 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65  ready thrown the
11c20 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61   error if VDBE a
11c30 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
11c40 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69   labelEnd = sqli
11c50 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11c60 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72  (v);.  labelCmpr
11c70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
11c80 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20  keLabel(v);...  
11c90 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20  /* Patch up the 
11ca0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
11cb0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f    */.  op = p->o
11cc0 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20  p;  .  pPrior = 
11cd0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
11ce0 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ert( pPrior->pOr
11cf0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f  derBy==0 );.  pO
11d00 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
11d10 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20  erBy;.  assert( 
11d20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f  pOrderBy );.  nO
11d30 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
11d40 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20  y->nExpr;..  /* 
11d50 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74  For operators ot
11d60 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
11d70 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61  LL we have to ma
11d80 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a  ke sure that.  *
11d90 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
11da0 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65  lause covers eve
11db0 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72  ry term of the r
11dc0 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a  esult set.  Add.
11dd0 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68    ** terms to th
11de0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
11df0 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
11e00 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54    */.  if( op!=T
11e10 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72  K_ALL ){.    for
11e20 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (i=1; db->malloc
11e30 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d  Failed==0 && i<=
11e40 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11e50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
11e60 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
11e70 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
11e80 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
11e90 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
11ea0 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49  OrderBy; j++, pI
11eb0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
11ec0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
11ed0 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
11ee0 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c   if( pItem->iCol
11ef0 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
11f00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
11f10 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
11f20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
11f30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
11f40 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
11f50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
11f60 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
11f70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11f80 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
11f90 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
11fa0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
11fb0 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20  u.iValue = i;.  
11fc0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
11fd0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11fe0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
11ff0 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a  OrderBy, pNew);.
12000 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
12010 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
12020 69 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20  iCol = (u16)i;. 
12030 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12040 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
12050 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65  he comparison pe
12060 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65  rmutation and ke
12070 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73  yinfo that is us
12080 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
12090 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65   permutation use
120a0 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
120b0 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20  f the next.  ** 
120c0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63  row of results c
120d0 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  omes from select
120e0 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41  A or selectB.  A
120f0 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74  lso add explicit
12100 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73  .  ** collations
12110 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
12120 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f   clause terms so
12130 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73   that when the s
12140 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  ubqueries.  ** t
12150 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20  o the right and 
12160 74 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61  the left are eva
12170 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65  luated, they use
12180 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a   the correct.  *
12190 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a  * collation..  *
121a0 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73  /.  aPermute = s
121b0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
121c0 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  w(db, sizeof(int
121d0 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69  )*nOrderBy);.  i
121e0 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
121f0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
12200 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
12210 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
12220 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
12230 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  i<nOrderBy; i++,
12240 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
12250 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
12260 69 43 6f 6c 3e 30 20 20 26 26 20 70 49 74 65 6d  iCol>0  && pItem
12270 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73  ->iCol<=p->pELis
12280 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
12290 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
122a0 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b  pItem->iCol - 1;
122b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
122c0 65 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c  erge =.      sql
122d0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
122e0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  db, sizeof(*pKey
122f0 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a  Merge)+nOrderBy*
12300 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
12310 29 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70  )+1));.    if( p
12320 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  KeyMerge ){.    
12330 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
12340 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
12350 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c  pKeyMerge->aColl
12360 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20  [nOrderBy];.    
12370 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69    pKeyMerge->nFi
12380 65 6c 64 20 3d 20 28 75 31 36 29 6e 4f 72 64 65  eld = (u16)nOrde
12390 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d  rBy;.      pKeyM
123a0 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  erge->enc = ENC(
123b0 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  db);.      for(i
123c0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
123d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  i++){.        Co
123e0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
123f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
12400 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m = pOrderBy->a[
12410 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
12420 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
12430 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
12440 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
12450 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  pColl = pTerm->p
12460 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  Coll;.        }e
12470 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
12480 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
12490 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
124a0 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d  , p, aPermute[i]
124b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  );.          pTe
124c0 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  rm->flags |= EP_
124d0 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ExpCollate;.    
124e0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f        pTerm->pCo
124f0 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  ll = pColl;.    
12500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b      }.        pK
12510 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69  eyMerge->aColl[i
12520 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
12530 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53     pKeyMerge->aS
12540 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
12550 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
12560 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a  tOrder;.      }.
12570 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
12580 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
12590 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
125a0 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
125b0 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
125c0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
125d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
125e0 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
125f0 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
12600 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
12610 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
12620 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c  By, 0);..  /* Al
12630 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
12640 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
12650 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
12660 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
12670 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
12680 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
12690 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
126a0 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
126b0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
126c0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
126d0 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
126e0 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
126f0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
12700 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
12710 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
12720 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
12730 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
12740 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
12750 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
12760 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
12770 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
12780 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  v = sqlite3GetTe
12790 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
127a0 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 73 71  nExpr+1);.    sq
127b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
127c0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
127d0 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
127e0 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
127f0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
12800 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12810 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79      sizeof(*pKey
12820 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28 73 69  Dup) + nExpr*(si
12830 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
12840 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ) );.    if( pKe
12850 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 70 4b  yDup ){.      pK
12860 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
12870 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 44 75  r = (u8*)&pKeyDu
12880 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  p->aColl[nExpr];
12890 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
128a0 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 45  nField = (u16)nE
128b0 78 70 72 3b 0a 20 20 20 20 20 20 70 4b 65 79 44  xpr;.      pKeyD
128c0 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  up->enc = ENC(db
128d0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
128e0 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
128f0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
12900 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
12910 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
12920 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
12930 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
12940 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
12950 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
12960 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
12970 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
12980 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
12990 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
129a0 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
129b0 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
129c0 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  r->pRightmost = 
129d0 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  0;.  sqlite3Reso
129e0 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
129f0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
12a00 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
12a10 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
12a20 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
12a30 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
12a40 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
12a50 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69  se, pPrior, pPri
12a60 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f  or->pOrderBy, "O
12a70 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  RDER");.  }..  /
12a80 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69  * Compute the li
12a90 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f  mit registers */
12aa0 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
12ab0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
12ac0 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   p, labelEnd);. 
12ad0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26   if( p->iLimit &
12ae0 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  & op==TK_ALL ){.
12af0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
12b00 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12b10 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20      regLimitB = 
12b20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12b40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
12b50 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  , p->iOffset ? p
12b60 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d  ->iOffset+1 : p-
12b70 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  >iLimit,.       
12b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b90 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69             regLi
12ba0 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  mitA);.    sqlit
12bb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12bc0 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69  OP_Copy, regLimi
12bd0 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a  tA, regLimitB);.
12be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
12bf0 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69  LimitA = regLimi
12c00 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  tB = 0;.  }.  sq
12c10 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
12c20 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
12c30 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
12c40 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
12c50 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66  lete(db, p->pOff
12c60 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73  set);.  p->pOffs
12c70 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64  et = 0;..  regAd
12c80 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drA = ++pParse->
12c90 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20  nMem;.  regEofA 
12ca0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12cb0 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b  ;.  regAddrB = +
12cc0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12cd0 20 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61   regEofB = ++pPa
12ce0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
12cf0 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
12d00 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
12d10 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12d20 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
12d30 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
12d40 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
12d50 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
12d60 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
12d70 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
12d80 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
12d90 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  ddrB);..  /* Jum
12da0 70 20 70 61 73 74 20 74 68 65 20 76 61 72 69 6f  p past the vario
12db0 75 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61  us subroutines a
12dc0 6e 64 20 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f  nd coroutines to
12dd0 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d   the main.  ** m
12de0 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
12df0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
12e00 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
12e10 74 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c 65 63  to);.  addrSelec
12e20 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tA = sqlite3Vdbe
12e30 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
12e40 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
12e50 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
12e60 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
12e70 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
12e80 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
12e90 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
12ea0 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
12eb0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
12ec0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12ed0 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75  (v, "Begin corou
12ee0 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45  tine for left SE
12ef0 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f  LECT"));.  pPrio
12f00 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  r->iLimit = regL
12f10 69 6d 69 74 41 3b 0a 20 20 73 71 6c 69 74 65 33  imitA;.  sqlite3
12f20 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
12f30 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
12f40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12f50 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12f60 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 1, regEofA);.
12f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12f80 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
12f90 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64   regAddrA);.  Vd
12fa0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
12fb0 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65  , "End coroutine
12fc0 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54   for left SELECT
12fd0 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  "));..  /* Gener
12fe0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
12ff0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
13000 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13010 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
13020 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
13030 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
13040 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
13050 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
13060 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  (v);.  VdbeNoopC
13070 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
13080 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
13090 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
130a0 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
130b0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
130c0 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
130d0 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
130e0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
130f0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
13100 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  ;  .  sqlite3Sel
13110 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
13120 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69  destB);.  p->iLi
13130 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74  mit = savedLimit
13140 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
13150 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20   savedOffset;.  
13160 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13170 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
13180 20 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20   1, regEofB);.  
13190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
131a0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
131b0 65 67 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65  egAddrB);.  Vdbe
131c0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
131d0 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66  "End coroutine f
131e0 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22  or right SELECT"
131f0 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ));..  /* Genera
13200 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
13210 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
13220 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
13230 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
13240 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
13250 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
13260 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
13270 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
13280 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
13290 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
132a0 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
132b0 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
132c0 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
132d0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
132e0 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
132f0 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13310 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
13320 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  p, P4_KEYINFO_HA
13330 4e 44 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29  NDOFF, labelEnd)
13340 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
13350 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
13360 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
13370 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
13380 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
13390 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
133a0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
133b0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
133c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
133d0 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
133e0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
133f0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
13400 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
13410 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
13420 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
13430 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
13440 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
13460 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
13470 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
13480 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
13490 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45  , pKeyDup, P4_KE
134a0 59 49 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61  YINFO_STATIC, la
134b0 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20  belEnd);.  }..  
134c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
134d0 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
134e0 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
134f0 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
13500 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
13510 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
13520 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
13530 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ins..  */.  Vdbe
13540 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
13550 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
13560 65 22 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  e"));.  if( op==
13570 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
13580 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
13590 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
135a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
135b0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
135c0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65   labelEnd);.  }e
135d0 6c 73 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45  lse{  .    addrE
135e0 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
135f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
13600 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c  , regEofB, label
13610 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
13620 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13630 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
13640 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
13650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13660 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
13670 72 65 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73  regAddrB);.    s
13680 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13690 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
136a0 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 7d 0a 0a  addrEofA);.  }..
136b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
136c0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
136d0 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
136e0 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42  ts from select B
136f0 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
13700 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
13710 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65  a in select A re
13720 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
13730 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
13740 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
13750 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20  fB = addrEofA;. 
13760 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
13770 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
13780 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74  , "eof-B subrout
13790 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
137a0 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64  EofB = sqlite3Vd
137b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
137c0 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65  f, regEofA, labe
137d0 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  lEnd);.    sqlit
137e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
137f0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
13800 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
13810 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13820 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
13830 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20   regAddrA);.    
13840 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13850 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
13860 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a   addrEofB);.  }.
13870 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
13880 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
13890 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20  e case of A<B.  
138a0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
138b0 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42  ment((v, "A-lt-B
138c0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
138d0 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c    addrAltB = sql
138e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
138f0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
13900 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
13910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13920 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
13930 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
13940 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13950 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
13960 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  A, addrEofA);.  
13970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13980 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
13990 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
139a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
139b0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
139c0 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f  ase of A==B.  */
139d0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
139e0 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  L ){.    addrAeq
139f0 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
13a00 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
13a10 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
13a20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
13a30 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41  rAltB;.    addrA
13a40 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ltB++;.  }else{.
13a50 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
13a60 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20  ent((v, "A-eq-B 
13a70 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
13a80 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20     addrAeqB =.  
13a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13aa0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
13ab0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20   regAddrA);.    
13ac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13ad0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
13ae0 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  ofA, addrEofA);.
13af0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13b00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
13b10 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
13b20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
13b30 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
13b40 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
13b50 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
13b60 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
13b70 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
13b80 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
13b90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
13ba0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
13bb0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
13bc0 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
13bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13be0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
13bf0 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
13c00 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
13c10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13c20 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
13c30 41 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65  AddrB);.  sqlite
13c40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13c50 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61  P_If, regEofB, a
13c60 64 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  ddrEofB);.  sqli
13c70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13c80 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
13c90 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54  elCmpr);..  /* T
13ca0 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e  his code runs on
13cb0 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
13cc0 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a   everything..  *
13cd0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
13ce0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
13cf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13d00 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
13d10 72 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 0, regEofA);.
13d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13d30 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
13d40 72 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a  r, 0, regEofB);.
13d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13d60 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
13d70 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53   regAddrA, addrS
13d80 65 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74  electA);.  sqlit
13d90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13da0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64  OP_Gosub, regAdd
13db0 72 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29  rB, addrSelectB)
13dc0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13dd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
13de0 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
13df0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
13e00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
13e10 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45  , regEofB, addrE
13e20 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c  ofB);..  /* Impl
13e30 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d  ement the main m
13e40 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
13e50 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
13e60 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
13e70 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lCmpr);.  sqlite
13e80 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13e90 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30  P_Permutation, 0
13ea0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61  , 0, 0, (char*)a
13eb0 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41  Permute, P4_INTA
13ec0 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  RRAY);.  sqlite3
13ed0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13ee0 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e  _Compare, destA.
13ef0 69 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d  iMem, destB.iMem
13f00 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , nOrderBy,.    
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
13f30 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46  Merge, P4_KEYINF
13f40 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71  O_HANDOFF);.  sq
13f50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13f60 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
13f70 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20  AltB, addrAeqB, 
13f80 61 64 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a  addrAgtB);..  /*
13f90 20 52 65 6c 65 61 73 65 20 74 65 6d 70 6f 72 61   Release tempora
13fa0 72 79 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a  ry registers.  *
13fb0 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
13fc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
13fd0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
13fe0 50 61 72 73 65 2c 20 72 65 67 50 72 65 76 2c 20  Parse, regPrev, 
13ff0 6e 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d  nOrderBy+1);.  }
14000 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
14010 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
14020 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
14030 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
14040 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14050 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14060 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
14070 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
14080 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d   of output colum
14090 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
140a0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
140b0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65  Output ){.    Se
140c0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
140d0 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65  Prior;.    while
140e0 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
140f0 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
14100 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
14110 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
14120 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
14130 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
14140 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65    }..  /* Reasse
14150 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
14160 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
14170 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
14180 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
14190 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
141a0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
141b0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
141c0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
141d0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
141e0 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
141f0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
14200 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e  .  /*** TBD:  In
14210 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20  sert subroutine 
14220 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63  calls to close c
14230 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70  ursors on incomp
14240 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71  lete.  **** subq
14250 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72  ueries ****/.  r
14260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14270 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
14280 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14290 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
142a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
142b0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46  _OMIT_VIEW)./* F
142c0 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
142d0 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
142e0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
142f0 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
14300 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
14310 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
14320 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
14330 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
14340 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
14350 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e   *);../*.** Scan
14360 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
14370 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
14380 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
14390 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
143a0 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
143b0 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
143c0 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
143d0 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
143e0 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
143f0 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
14400 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
14410 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
14420 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
14430 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
14440 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
14450 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
14460 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
14470 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
14480 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
14490 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
144a0 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
144b0 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
144c0 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
144d0 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
144e0 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
144f0 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
14500 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
14510 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
14520 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
14530 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
14540 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
14550 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
14560 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
14570 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
14580 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
14590 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
145a0 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
145b0 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ery..*/.static E
145c0 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a  xpr *substExpr(.
145d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
145e0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
145f0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f  malloc errors to
14600 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
14610 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
14620 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  r,        /* Exp
14630 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74  r in which subst
14640 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a  itution occurs *
14650 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
14660 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
14670 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
14680 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
14690 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53   *pEList    /* S
146a0 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73  ubstitute expres
146b0 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  sions */.){.  if
146c0 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
146d0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
146e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
146f0 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
14700 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
14710 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
14720 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
14730 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
14740 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
14750 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
14760 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14770 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
14780 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
14790 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
147a0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
147b0 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
147c0 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
147d0 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
147e0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
147f0 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  , pEList->a[pExp
14800 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
14810 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
14820 20 70 4e 65 77 20 26 26 20 70 45 78 70 72 2d 3e   pNew && pExpr->
14830 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
14840 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70   pNew->pColl = p
14850 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Expr->pColl;.   
14860 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
14870 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
14880 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70   pExpr);.      p
14890 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Expr = pNew;.   
148a0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
148b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
148c0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
148d0 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  pr->pLeft, iTabl
148e0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
148f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
14900 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
14910 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
14920 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14930 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
14940 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
14950 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
14960 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
14970 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  db, pExpr->x.pSe
14980 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
14990 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  List);.    }else
149a0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
149b0 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d  rList(db, pExpr-
149c0 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65  >x.pList, iTable
149d0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
149e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
149f0 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  xpr;.}.static vo
14a00 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
14a10 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
14a20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
14a30 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
14a40 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c   here */.  ExprL
14a50 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
14a60 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20  /* List to scan 
14a70 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20  and in which to 
14a80 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73  make substitutes
14a90 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
14aa0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
14ab0 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
14ac0 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
14ad0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
14ae0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
14af0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lues */.){.  int
14b00 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
14b10 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
14b20 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
14b30 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14b40 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
14b50 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
14b60 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
14b70 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
14b80 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
14b90 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
14ba0 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  elect(.  sqlite3
14bb0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
14bc0 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
14bd0 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
14be0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
14bf0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
14c00 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
14c10 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
14c20 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
14c30 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
14c40 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
14c50 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45   replaced */.  E
14c60 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
14c70 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
14c80 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
14c90 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
14ca0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
14cb0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
14cc0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20  int i;.  if( !p 
14cd0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
14ce0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
14cf0 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
14d00 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
14d10 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
14d20 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
14d30 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
14d40 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
14d50 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
14d60 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14d70 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  p->pHaving = sub
14d80 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48  stExpr(db, p->pH
14d90 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70  aving, iTable, p
14da0 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68  EList);.  p->pWh
14db0 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
14dc0 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69  db, p->pWhere, i
14dd0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14de0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
14df0 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61  , p->pPrior, iTa
14e00 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14e10 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
14e20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
14e30 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28  ;  /* Even for (
14e40 53 45 4c 45 43 54 20 31 29 20 77 65 20 68 61 76  SELECT 1) we hav
14e50 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74 20 70  e: pSrc!=0 but p
14e60 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a  Src->nSrc==0 */.
14e70 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
14e80 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  c) ){.    for(i=
14e90 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65  pSrc->nSrc, pIte
14ea0 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20  m=pSrc->a; i>0; 
14eb0 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
14ec0 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
14ed0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  (db, pItem->pSel
14ee0 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
14ef0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
14f00 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
14f10 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14f20 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
14f30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14f40 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
14f50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14f60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
14f70 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
14f80 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
14f90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14fa0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
14fb0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
14fc0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65  in order to spee
14fd0 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20  d.** execution. 
14fe0 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66   It returns 1 if
14ff0 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65   it makes change
15000 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c  s and 0 if no fl
15010 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75  attening.** occu
15020 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
15030 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
15040 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
15050 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
15060 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
15070 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
15080 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
15090 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
150a0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
150b0 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
150c0 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
150d0 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
150e0 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
150f0 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
15100 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
15110 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
15120 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
15130 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
15140 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
15150 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
15160 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15170 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
15180 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
15190 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
151a0 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
151b0 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
151c0 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
151d0 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
151e0 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
151f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
15200 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
15210 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
15220 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
15230 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
15240 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
15250 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
15260 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
15270 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
15280 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
15290 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
152a0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
152b0 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
152c0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
152d0 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69  for this simpifi
152e0 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
152f0 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
15300 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
15310 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
15320 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
15330 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
15340 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
15350 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
15360 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
15370 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
15380 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
15390 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
153a0 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
153b0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
153c0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
153d0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
153e0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
153f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
15400 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
15410 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
15420 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
15430 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
15440 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f  gregate or the o
15450 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
15460 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
15470 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
15480 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
15490 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
154a0 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
154b0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69  n.**        (Ori
154c0 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23  ginally ticket #
154d0 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e  306.  Strengthen
154e0 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33  ed by ticket #33
154f0 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  00).**.**   (4) 
15500 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
15510 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a   not DISTINCT..*
15520 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
15530 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
15540 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
15550 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
15560 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
15570 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
15580 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
15590 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
155a0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
155b0 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
155c0 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
155d0 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
155e0 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
155f0 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
15600 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  eries..**.**   (
15610 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
15620 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
15630 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
15640 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
15650 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
15660 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
15670 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
15680 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
15690 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  se..**.**   (8) 
156a0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
156b0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
156c0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
156d0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
156e0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
156f0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
15700 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
15710 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
15720 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
15730 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
15740 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
15750 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
15760 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
15770 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
15780 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
15790 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
157a0 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
157b0 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
157c0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
157d0 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
157e0 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
157f0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
15800 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
15810 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
15820 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
15830 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
15840 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
15850 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
15860 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
15870 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
15880 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
15890 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
158a0 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
158b0 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
158c0 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
158d0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
158e0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
158f0 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
15900 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
15910 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
15920 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
15930 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
15940 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
15950 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
15960 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
15970 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
15980 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
15990 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
159a0 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
159b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
159c0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
159d0 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
159e0 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
159f0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
15a00 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
15a10 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
15a20 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
15a30 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
15a40 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
15a50 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
15a60 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
15a70 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
15a80 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
15a90 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
15aa0 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
15ab0 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
15ac0 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
15ad0 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
15ae0 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
15af0 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
15b00 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
15b10 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
15b20 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
15b30 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
15b40 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
15b50 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
15b60 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
15b70 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
15b80 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
15b90 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68 61  **          * ha
15ba0 73 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  s no other table
15bb0 73 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73  s or sub-selects
15bc0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
15bd0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  use..**.**      
15be0 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64    The parent and
15bf0 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63   sub-query may c
15c00 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61  ontain WHERE cla
15c10 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f  uses. Subject to
15c20 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73  .**        rules
15c30 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20   (11), (13) and 
15c40 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61  (14), they may a
15c50 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  lso contain ORDE
15c60 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20  R BY,.**        
15c70 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
15c80 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
15c90 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75   (18)  If the su
15ca0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
15cb0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
15cc0 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  en all terms of 
15cd0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52  the.**        OR
15ce0 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66  DER by clause of
15cf0 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74   the parent must
15d00 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72   be simple refer
15d10 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20  ences to .**    
15d20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
15d30 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
15d40 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73  .**  (19)  The s
15d50 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
15d60 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
15d70 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
15d80 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
15d90 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c   have a WHERE cl
15da0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30  ause..**.**  (20
15db0 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
15dc0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
15dd0 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69  d select, then i
15de0 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a  t must not use.*
15df0 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45  *        an ORDE
15e00 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69  R BY clause.  Ti
15e10 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20  cket #3773.  We 
15e20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73  could relax this
15e30 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20   constraint.**  
15e40 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62        somewhat b
15e50 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68  y saying that th
15e60 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  e terms of the O
15e70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d  RDER BY clause m
15e80 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70  ust.**        ap
15e90 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69  pear as unmodifi
15ea0 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ed result column
15eb0 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
15ec0 75 65 72 79 2e 20 20 42 75 74 0a 2a 2a 20 20 20  uery.  But.**   
15ed0 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
15ee0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
15ef0 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
15f00 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
15f10 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
15f20 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
15f30 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
15f40 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
15f50 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
15f60 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
15f70 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
15f80 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
15f90 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
15fa0 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
15fb0 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
15fc0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
15fd0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
15fe0 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
15ff0 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
16000 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
16010 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
16020 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
16030 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
16040 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
16050 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
16060 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
16070 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
16080 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
16090 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
160a0 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
160b0 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
160c0 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
160d0 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
160e0 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
160f0 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
16100 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
16110 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
16120 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
16130 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
16140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16150 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
16160 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16170 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
16180 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
16190 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
161a0 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
161b0 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
161c0 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
161d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
161e0 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
161f0 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
16200 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
16210 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
16220 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
16230 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
16240 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
16250 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
16260 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
16270 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
16280 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
16290 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
162a0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  ;.  Select *pSub
162b0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
162c0 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
162d0 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
162e0 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
162f0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
16300 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
16310 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
16320 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
16330 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
16340 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
16350 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16360 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
16370 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
16380 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
16390 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
163a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
163b0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
163c0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
163d0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
163e0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
163f0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
16400 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
16410 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
16420 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
16430 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
16440 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
16450 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
16460 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
16470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16480 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
16490 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
164a0 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
164b0 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
164c0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
164d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
164e0 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
164f0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
16500 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
16510 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
16520 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
16530 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
16540 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
16550 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65  =0 );  /* Unable
16560 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70   to flatten comp
16570 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a  ound queries */.
16580 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
16590 26 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c  & SQLITE_QueryFl
165a0 61 74 74 65 6e 65 72 20 29 20 72 65 74 75 72 6e  attener ) return
165b0 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
165c0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
165d0 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
165e0 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
165f0 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
16600 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
16610 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
16620 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
16630 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
16640 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
16650 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
16660 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67  =0 );.  if( isAg
16670 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  g && subqueryIsA
16680 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  gg ) return 0;  
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
166a0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
166b0 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71  )  */.  if( subq
166c0 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72  ueryIsAgg && pSr
166d0 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
166e0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
166f0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
16700 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20  )  */.  pSubSrc 
16710 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
16720 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
16730 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f  );.  /* Prior to
16740 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20   version 3.1.2, 
16750 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
16760 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20  FFSET had to be 
16770 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73  simple constants
16780 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74  ,.  ** not arbit
16790 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e  rary expresssion
167a0 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
167b0 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
167c0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
167d0 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
167e0 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
167f0 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
16800 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
16810 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
16820 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
16830 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
16840 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
16850 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
16860 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
16870 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
16880 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
16890 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
168a0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
168b0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
168c0 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
168d0 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65  if( pSub->pOffse
168e0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16900 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
16910 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
16920 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
16930 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t && pSub->pLimi
16940 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
16950 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16980 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35   Restriction (15
16990 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
169a0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
169b0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169d0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
169e0 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (7)  */.  if( p
169f0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
16a00 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  SF_Distinct ) re
16a10 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
16a20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16a30 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (5)  */.  if( p
16a40 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
16a50 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
16a60 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72  isAgg) ){.     r
16a70 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
16a80 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
16a90 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20   (8)(9) */.  }. 
16aa0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
16ab0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
16ac0 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49  !=0 && subqueryI
16ad0 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74  sAgg ){.     ret
16ae0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
16af0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36  * Restriction (6
16b00 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  )  */.  }.  if( 
16b10 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
16b20 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
16b30 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16b70 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
16b80 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
16b90 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
16ba0 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16bc0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
16bd0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
16be0 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
16bf0 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16c10 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
16c20 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c  ) */..  /* OBSOL
16c30 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20  ETE COMMENT 1:. 
16c40 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
16c50 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
16c60 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
16c70 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
16c80 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
16c90 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
16ca0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
16cb0 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
16cc0 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
16cd0 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
16ce0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
16cf0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
16d00 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
16d10 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
16d20 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
16d30 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
16d40 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
16d50 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
16d60 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
16d70 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
16d80 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
16d90 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
16da0 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
16db0 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  ** OBSOLETE C
16dc0 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52  OMMENT 2:.  ** R
16dd0 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
16de0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
16df0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
16e00 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
16e10 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
16e20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
16e30 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
16e40 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
16e50 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
16e60 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
16e70 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
16e80 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
16e90 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
16ea0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
16eb0 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
16ec0 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
16ed0 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
16ee0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
16ef0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
16f00 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
16f10 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
16f20 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
16f30 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
16f40 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
16f50 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
16f60 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
16f70 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
16f80 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
16f90 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
16fa0 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a  INNER JOIN..  **
16fb0 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52  .  ** THIS OVERR
16fc0 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f  IDES OBSOLETE CO
16fd0 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41  MMENTS 1 AND 2 A
16fe0 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65  BOVE:.  ** Ticke
16ff0 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68  t #3300 shows th
17000 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  at flattening th
17010 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
17020 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a  a LEFT JOIN.  **
17030 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68   is fraught with
17040 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74   danger.  Best t
17050 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c  o avoid the whol
17060 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65  e thing.  If the
17070 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
17080 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
17090 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
170a0 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61   then do not fla
170b0 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tten..  */.  if(
170c0 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e   (pSubitem->join
170d0 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
170e0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
170f0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
17100 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49  estriction 17: I
17110 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
17120 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
17130 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  LECT, then it mu
17140 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79  st.  ** use only
17150 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   the UNION ALL o
17160 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e  perator. And non
17170 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20  e of the simple 
17180 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20  select queries. 
17190 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70   ** that make up
171a0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
171b0 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64  LECT are allowed
171c0 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65   to be aggregate
171d0 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a   or distinct.  *
171e0 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
171f0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
17200 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  or ){.    if( pS
17210 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
17220 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
17230 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
17240 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  20 */.    }.    
17250 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d  if( isAgg || (p-
17260 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
17270 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70  istinct)!=0 || p
17280 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a  Src->nSrc!=1 ){.
17290 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
172a0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53      }.    for(pS
172b0 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b  ub1=pSub; pSub1;
172c0 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50   pSub1=pSub1->pP
172d0 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73  rior){.      tes
172e0 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
172f0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
17300 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
17310 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
17320 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ct );.      test
17330 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
17340 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
17350 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
17360 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
17370 74 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  te );.      if( 
17380 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
17390 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
173a0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
173b0 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  0.       || (pSu
173c0 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
173d0 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
173e0 20 0a 20 20 20 20 20 20 20 7c 7c 20 4e 45 56 45   .       || NEVE
173f0 52 28 70 53 75 62 31 2d 3e 70 53 72 63 3d 3d 30  R(pSub1->pSrc==0
17400 29 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63  ) || pSub1->pSrc
17410 2d 3e 6e 53 72 63 21 3d 31 0a 20 20 20 20 20 20  ->nSrc!=1.      
17420 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
17430 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
17440 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
17450 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20  iction 18. */.  
17460 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
17470 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
17480 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
17490 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
174a0 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
174b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
174c0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
174d0 69 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  iCol==0 ) return
174e0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
174f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20  }.  }..  /***** 
17500 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
17510 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69   point, flatteni
17520 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
17530 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75   *****/..  /* Au
17540 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71  thorize the subq
17550 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65  uery */.  pParse
17560 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
17570 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
17580 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43  ;.  sqlite3AuthC
17590 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
175a0 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
175b0 2c 20 30 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  , 0);.  pParse->
175c0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
175d0 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
175e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
175f0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
17600 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
17610 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
17620 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
17630 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
17640 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
17650 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
17660 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
17670 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
17680 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
17690 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
176a0 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
176b0 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
176c0 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
176d0 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
176e0 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
176f0 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
17700 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
17710 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
17720 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70   creates N-1 cop
17730 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
17740 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
17750 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
17760 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
17770 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
17780 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
17790 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
177a0 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
177b0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
177c0 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
177d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
177e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
177f0 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
17800 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
17810 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
17820 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  ub-query..  **. 
17830 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
17840 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
17850 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a  T a+1 FROM (.  *
17860 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
17870 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  x FROM tab.  ** 
17880 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
17890 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
178a0 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20  ECT y FROM tab. 
178b0 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
178c0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
178d0 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
178e0 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20   FROM tab2.  ** 
178f0 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35      ) WHERE a!=5
17900 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
17910 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  .  ** Transforme
17920 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
17930 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31  *     SELECT x+1
17940 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
17950 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  x+1!=5.  **     
17960 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
17970 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52     SELECT y+1 FR
17980 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31  OM tab WHERE y+1
17990 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
179a0 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
179b0 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b  SELECT abs(z*2)+
179c0 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52  1 FROM tab2 WHER
179d0 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a  E abs(z*2)+1!=5.
179e0 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42    **     ORDER B
179f0 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  Y 1.  **.  ** We
17a00 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22   call this the "
17a10 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
17a20 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20  y flattening".. 
17a30 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
17a40 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
17a50 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
17a60 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
17a70 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
17a80 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
17a90 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
17aa0 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
17ab0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
17ac0 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
17ad0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
17ae0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
17af0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
17b00 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
17b10 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
17b20 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  mit = 0;.    pNe
17b30 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  w = sqlite3Selec
17b40 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a  tDup(db, p, 0);.
17b50 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
17b60 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70  pLimit;.    p->p
17b70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
17b80 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  By;.    p->pSrc 
17b90 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f  = pSrc;.    p->o
17ba0 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20  p = TK_ALL;.    
17bb0 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  p->pRightmost = 
17bc0 30 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  0;.    if( pNew=
17bd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  =0 ){.      pNew
17be0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = pPrior;.    }
17bf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
17c00 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
17c10 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  r;.      pNew->p
17c20 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
17c30 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69     }.    p->pPri
17c40 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69  or = pNew;.    i
17c50 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
17c60 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
17c70 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
17c80 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69  flattening the i
17c90 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
17ca0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
17cb0 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75   .  ** in the ou
17cc0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
17cd0 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d    pSub = pSub1 =
17ce0 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
17cf0 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  ct;..  /* Delete
17d00 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74   the transient t
17d10 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
17d20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
17d30 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
17d40 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
17d50 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
17d60 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
17d70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17d80 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  db, pSubitem->zN
17d90 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
17da0 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
17db0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70  em->zAlias);.  p
17dc0 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
17dd0 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  se = 0;.  pSubit
17de0 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  em->zName = 0;. 
17df0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
17e00 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  s = 0;.  pSubite
17e10 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  m->pSelect = 0;.
17e20 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65  .  /* Defer dele
17e30 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f  ting the Table o
17e40 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
17e50 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
17e60 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f  ubquery until co
17e70 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73  de generation is
17e80 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20  .  ** complete, 
17e90 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20  since there may 
17ea0 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72  still exist Expr
17eb0 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68  .pTab entries th
17ec0 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f  at.  ** refer to
17ed0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76   the subquery ev
17ee0 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e  en after flatten
17ef0 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33  ing.  Ticket #33
17f00 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53  46..  **.  ** pS
17f10 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20  ubitem->pTab is 
17f20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  always non-NULL 
17f30 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74  by test restrict
17f40 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61  ions and tests a
17f50 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bove..  */.  if(
17f60 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d   ALWAYS(pSubitem
17f70 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
17f80 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44    Table *pTabToD
17f90 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  el = pSubitem->p
17fa0 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
17fb0 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20  bToDel->nRef==1 
17fc0 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a  ){.      Parse *
17fd0 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
17fe0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
17ff0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18000 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74  pTabToDel->pNext
18010 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76  Zombie = pToplev
18020 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a  el->pZombieTab;.
18030 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
18040 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54  >pZombieTab = pT
18050 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c  abToDel;.    }el
18060 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  se{.      pTabTo
18070 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  Del->nRef--;.   
18080 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d   }.    pSubitem-
18090 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a  >pTab = 0;.  }..
180a0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
180b0 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  ng loop runs onc
180c0 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
180d0 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  in a compound-su
180e0 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74  bquery.  ** flat
180f0 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72  tening (as descr
18100 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66  ibed above).  If
18110 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
18120 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20  different kind. 
18130 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e   ** of flattenin
18140 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67  g - a flattening
18150 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
18160 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
18170 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a  flattening -.  *
18180 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70  * then this loop
18190 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e   only runs once.
181a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
181b0 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f  loop moves all o
181c0 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
181d0 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
181e0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
181f0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
18200 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
18210 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
18220 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
18230 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
18240 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
18250 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
18260 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
18270 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
18280 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
18290 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
182a0 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
182b0 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
182c0 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
182d0 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
182e0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
182f0 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
18300 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
18310 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
18320 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
18330 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
18340 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
18350 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
18360 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
18370 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61  ..  */.  for(pPa
18380 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b  rent=p; pParent;
18390 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74   pParent=pParent
183a0 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70  ->pPrior, pSub=p
183b0 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
183c0 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20    int nSubSrc;. 
183d0 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d     u8 jointype =
183e0 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20   0;.    pSubSrc 
183f0 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20  = pSub->pSrc;   
18400 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
18410 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a   of subquery */.
18420 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53      nSubSrc = pS
18430 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a  ubSrc->nSrc;  /*
18440 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
18450 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f   in subquery FRO
18460 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
18470 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
18480 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
18490 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
184a0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a  outer query */..
184b0 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a      if( pSrc ){.
184c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
184d0 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20  arent==p );  /* 
184e0 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75  First time throu
184f0 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
18500 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20       jointype = 
18510 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
18520 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pe;.    }else{. 
18530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
18540 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32  rent!=p );  /* 2
18550 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
18560 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20  t times through 
18570 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
18580 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
18590 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
185a0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
185b0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
185c0 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b    if( pSrc==0 ){
185d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
185e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
185f0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d );.        bre
18600 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
18610 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75  }..    /* The su
18620 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69  bquery uses a si
18630 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65  ngle slot of the
18640 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
18650 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  the outer.    **
18660 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20   query.  If the 
18670 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72  subquery has mor
18680 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65  e than one eleme
18690 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  nt in its FROM c
186a0 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68  lause,.    ** th
186b0 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  en expand the ou
186c0 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b  ter query to mak
186d0 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74  e space for it t
186e0 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65  o hold all eleme
186f0 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
18700 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
18710 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
18720 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
18730 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
18740 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20  M tabA, (SELECT 
18750 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62  * FROM sub1, sub
18760 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a  2), tabB;.    **
18770 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65  .    ** The oute
18780 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c  r query has 3 sl
18790 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ots in its FROM 
187a0 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f  clause.  One slo
187b0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
187c0 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65  outer query (the
187d0 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73   middle slot) is
187e0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62   used by the sub
187f0 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74  query.  The next
18800 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66  .    ** block of
18810 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e   code will expan
18820 64 20 74 68 65 20 6f 75 74 20 71 75 65 72 79 20  d the out query 
18830 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65  to 4 slots.  The
18840 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73   middle.    ** s
18850 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20  lot is expanded 
18860 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20  to two slots in 
18870 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70  order to make sp
18880 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20  ace for the.    
18890 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20  ** two elements 
188a0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
188b0 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
188c0 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
188d0 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
188e0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
188f0 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c  Src = pSrc = sql
18900 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
18910 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75  ge(db, pSrc, nSu
18920 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b  bSrc-1,iFrom+1);
18930 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
18940 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
18950 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
18960 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
18970 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
18980 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
18990 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71  ms from the subq
189a0 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
189b0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
189c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
189d0 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
189e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
189f0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
18a00 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69  (db, pSrc->a[i+i
18a10 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  From].pUsing);. 
18a20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
18a30 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
18a40 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
18a50 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
18a60 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
18a70 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
18a80 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
18a90 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65  [iFrom].jointype
18aa0 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a   = jointype;.  .
18ab0 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e      /* Now begin
18ac0 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
18ad0 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
18ae0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
18af0 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  r .    ** refere
18b00 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72  nces to the iPar
18b10 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ent in the outer
18b20 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a   query..    ** .
18b30 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
18b40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
18b50 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
18b60 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
18b70 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
18b80 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
18b90 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c   a>b;.    **   \
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
18bc0 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
18bd0 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
18be0 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f    /.    **    \_
18bf0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18c00 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
18c10 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
18c20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
18c30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
18c40 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20  e look at every 
18c50 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
18c60 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
18c70 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
18c80 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20   see.    ** "a" 
18c90 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
18ca0 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
18cb0 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
18cc0 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
18cd0 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  10"..    */.    
18ce0 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d  pList = pParent-
18cf0 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72  >pEList;.    for
18d00 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
18d10 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
18d20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
18d30 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ].zName==0 ){.  
18d40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
18d50 20 2a 7a 53 70 61 6e 20 3d 20 70 4c 69 73 74 2d   *zSpan = pList-
18d60 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20  >a[i].zSpan;.   
18d70 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
18d80 7a 53 70 61 6e 29 20 29 7b 0a 20 20 20 20 20 20  zSpan) ){.      
18d90 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
18da0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
18db0 62 53 74 72 44 75 70 28 64 62 2c 20 7a 53 70 61  bStrDup(db, zSpa
18dc0 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
18dd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18de0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
18df0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  , pParent->pELis
18e00 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
18e10 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  ->pEList);.    i
18e20 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
18e30 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18e40 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72  db, pParent->pGr
18e50 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  oupBy, iParent, 
18e60 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
18e70 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
18e80 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
18e90 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
18ea0 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
18eb0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
18ec0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
18ed0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
18ee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
18ef0 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d  arent->pOrderBy=
18f00 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
18f10 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ent->pOrderBy = 
18f20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
18f30 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64        pSub->pOrd
18f40 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erBy = 0;.    }e
18f50 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d  lse if( pParent-
18f60 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
18f70 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
18f80 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f  (db, pParent->pO
18f90 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
18fa0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
18fb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
18fc0 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
18fd0 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
18fe0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
18ff0 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29  pSub->pWhere, 0)
19000 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19010 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
19020 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62     }.    if( sub
19030 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
19040 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
19050 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ent->pHaving==0 
19060 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
19070 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72  ->pHaving = pPar
19080 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  ent->pWhere;.   
19090 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
190a0 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
190b0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
190c0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
190d0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
190e0 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
190f0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
19100 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
19110 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
19120 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
19130 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20  t->pHaving, .   
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
19160 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
19170 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c  , pSub->pHaving,
19180 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65   0));.      asse
19190 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72  rt( pParent->pGr
191a0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
191b0 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75    pParent->pGrou
191c0 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
191d0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75  rListDup(db, pSu
191e0 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b  b->pGroupBy, 0);
191f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19200 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
19210 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  e = substExpr(db
19220 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
19230 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
19240 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
19250 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
19260 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
19270 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
19280 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a  Where, pWhere);.
19290 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
192a0 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
192b0 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20  ery is distinct 
192c0 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  if either the in
192d0 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ner or the.    *
192e0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
192f0 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20   distinct. .    
19300 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  */.    pParent->
19310 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62  selFlags |= pSub
19320 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
19330 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20  Distinct;.  .   
19340 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43   /*.    ** SELEC
19350 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
19360 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
19370 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
19380 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a   OFFSET y;.    *
19390 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20  *.    ** One is 
193a0 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74  tempted to try t
193b0 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f  o add a and b to
193c0 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d   combine the lim
193d0 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20  its.  But this. 
193e0 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77     ** does not w
193f0 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69  ork if either li
19400 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
19410 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19420 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
19430 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
19440 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c  Limit = pSub->pL
19450 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62  imit;.      pSub
19460 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
19470 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
19480 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
19490 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
194a0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
194b0 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
194c0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
194d0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
194e0 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72  db, pSub1);..  r
194f0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
19500 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
19510 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
19520 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
19530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
19540 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  ) */../*.** Anal
19550 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  yze the SELECT s
19560 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
19570 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
19580 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69  o see if it.** i
19590 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  s a min() or max
195a0 28 29 20 71 75 65 72 79 2e 20 52 65 74 75 72 6e  () query. Return
195b0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
195c0 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45  IN or WHERE_ORDE
195d0 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69  RBY_MAX if .** i
195e0 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72  t is, or 0 other
195f0 77 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74  wise. At present
19600 2c 20 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e  , a query is con
19610 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a  sidered to be.**
19620 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71   a min()/max() q
19630 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  uery if:.**.**  
19640 20 31 2e 20 54 68 65 72 65 20 69 73 20 61 20 73   1. There is a s
19650 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20  ingle object in 
19660 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
19670 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72  .**.**   2. Ther
19680 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78  e is a single ex
19690 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
196a0 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
196b0 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69  it is.**      ei
196c0 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d  ther min(x) or m
196d0 61 78 28 78 29 2c 20 77 68 65 72 65 20 78 20 69  ax(x), where x i
196e0 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  s a column refer
196f0 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
19700 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 53  u8 minMaxQuery(S
19710 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70  elect *p){.  Exp
19720 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72  r *pExpr;.  Expr
19730 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
19740 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28  ->pEList;..  if(
19750 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
19760 31 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45  1 ) return WHERE
19770 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
19780 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73  .  pExpr = pELis
19790 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
197a0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
197b0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
197c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
197d0 28 20 4e 45 56 45 52 28 45 78 70 72 48 61 73 50  ( NEVER(ExprHasP
197e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
197f0 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 20  P_xIsSelect)) ) 
19800 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69  return 0;.  pELi
19810 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
19820 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
19830 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e  t==0 || pEList->
19840 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
19850 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  n 0;.  if( pELis
19860 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
19870 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
19880 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f   ) return WHERE_
19890 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
198a0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
198b0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
198c0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
198d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
198e0 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
198f0 7a 54 6f 6b 65 6e 2c 22 6d 69 6e 22 29 3d 3d 30  zToken,"min")==0
19900 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
19910 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
19920 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
19930 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78  lite3StrICmp(pEx
19940 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61  pr->u.zToken,"ma
19950 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  x")==0 ){.    re
19960 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
19970 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65  BY_MAX;.  }.  re
19980 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
19990 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a  BY_NORMAL;.}../*
199a0 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
199b0 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
199c0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
199d0 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72  ument is an aggr
199e0 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
199f0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65  The second argme
19a00 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
19a10 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
19a20 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
19a30 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
19a40 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
19a50 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
19a60 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
19a70 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
19a80 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
19a90 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
19aa0 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
19ab0 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
19ac0 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
19ad0 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
19ae0 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
19af0 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
19b00 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
19b10 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
19b20 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
19b30 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
19b40 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
19b50 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
19b60 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
19b70 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
19b80 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
19b90 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
19ba0 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
19bb0 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
19bc0 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
19bd0 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
19be0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
19bf0 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
19c00 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
19c10 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
19c20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
19c30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
19c40 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
19c50 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
19c60 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
19c70 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
19c80 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
19c90 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
19ca0 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
19cb0 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
19cc0 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
19cd0 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
19ce0 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
19cf0 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
19d00 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
19d10 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ->flags&SQLITE_F
19d20 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
19d30 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
19d40 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
19d50 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
19d60 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
19d70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
19d80 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
19d90 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
19da0 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
19db0 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
19dc0 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
19dd0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
19de0 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
19df0 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
19e00 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
19e10 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
19e20 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
19e30 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
19e40 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
19e50 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
19e60 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
19e70 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
19e80 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
19e90 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
19ea0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
19eb0 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
19ec0 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
19ed0 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
19ee0 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
19ef0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
19f00 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
19f10 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65   && pFrom->zInde
19f20 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  x ){.    Table *
19f30 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
19f40 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
19f50 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49  ndex = pFrom->zI
19f60 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20  ndex;.    Index 
19f70 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
19f80 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
19f90 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ; .        pIdx 
19fa0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
19fb0 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pIdx->zName, z
19fc0 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20  Index); .       
19fd0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
19fe0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
19ff0 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
1a000 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a010 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1a020 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
1a030 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dex, 0);.      p
1a040 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1a050 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
1a060 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1a070 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
1a080 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64  om->pIndex = pId
1a090 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
1a0a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1a0b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a0c0 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c   is a Walker cal
1a0d0 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e  lback for "expan
1a0e0 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73  ding" a SELECT s
1a0f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78  tatement..** "Ex
1a100 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74  panding" means t
1a110 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  o do the followi
1a120 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ng:.**.**    (1)
1a130 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
1a140 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1a150 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
1a160 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
1a170 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
1a180 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1a190 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
1a1a0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
1a1b0 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
1a1c0 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
1a1d0 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
1a1e0 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
1a1f0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
1a200 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
1a210 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1a220 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
1a230 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
1a240 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
1a250 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
1a260 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
1a270 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
1a280 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
1a290 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
1a2a0 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
1a2b0 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
1a2c0 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
1a2d0 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
1a2e0 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
1a2f0 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
1a300 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
1a310 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
1a320 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
1a330 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65  he presistent re
1a340 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
1a350 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
1a360 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
1a370 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
1a380 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1a390 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74   to accomodate t
1a3a0 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
1a3b0 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
1a3c0 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
1a3d0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1a3e0 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
1a3f0 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
1a400 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
1a410 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
1a420 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
1a430 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
1a440 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
1a450 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
1a460 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
1a470 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
1a480 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
1a490 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
1a4a0 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
1a4b0 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
1a4c0 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
1a4d0 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
1a4e0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
1a4f0 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
1a500 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
1a510 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
1a520 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
1a530 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
1a540 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
1a550 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
1a560 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
1a570 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
1a580 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
1a590 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1a5a0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
1a5b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1a5c0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
1a5d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a5e0 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
1a5f0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
1a600 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70    if( NEVER(p->p
1a610 53 72 63 3d 3d 30 29 20 7c 7c 20 28 70 2d 3e 73  Src==0) || (p->s
1a620 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70  elFlags & SF_Exp
1a630 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20  anded)!=0 ){.   
1a640 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
1a650 65 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46  e;.  }.  p->selF
1a660 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
1a670 64 65 64 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  ded;.  pTabList 
1a680 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
1a690 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
1a6a0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1a6b0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1a6c0 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
1a6d0 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
1a6e0 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
1a6f0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1a700 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1a710 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
1a720 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1a730 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54  rsors(pParse, pT
1a740 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c  abList);..  /* L
1a750 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
1a760 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
1a770 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1a780 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
1a790 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
1a7a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1a7b0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
1a7c0 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
1a7d0 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
1a7e0 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
1a7f0 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
1a800 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
1a810 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
1a820 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
1a830 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
1a840 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
1a850 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
1a860 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
1a870 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46  pTab;.    if( pF
1a880 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
1a890 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
1a8a0 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
1a8b0 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
1a8c0 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
1a8d0 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
1a8e0 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
1a8f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
1a900 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
1a910 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1a920 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f    }.    if( pFro
1a930 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
1a940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a950 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1a960 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
1a970 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
1a980 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
1a990 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
1a9a0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1a9b0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
1a9c0 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b  sert( pSel!=0 );
1a9d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a9e0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
1a9f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
1aa00 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1aa10 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70  , pSel);.      p
1aa20 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
1aa30 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
1aa40 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1aa50 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
1aa60 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
1aa70 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1aa80 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
1aa90 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54  ef = 1;.      pT
1aaa0 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
1aab0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1aac0 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f  sqlite_subquery_
1aad0 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54 61  %p_", (void*)pTa
1aae0 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  b);.      while(
1aaf0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b   pSel->pPrior ){
1ab00 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
1ab10 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65  rior; }.      se
1ab20 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
1ab30 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1ab40 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70  pSel->pEList, &p
1ab50 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
1ab60 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70  ->aCol);.      p
1ab70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
1ab80 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
1ab90 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
1aba0 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
1abb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1abc0 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
1abd0 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
1abe0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1abf0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
1ac00 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
1ac10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
1ac20 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
1ac30 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
1ac40 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
1ac50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e  arse,0,pFrom->zN
1ac60 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61  ame,pFrom->zData
1ac70 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  base);.      if(
1ac80 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
1ac90 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1aca0 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
1acb0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1acc0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
1acd0 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
1ace0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1acf0 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
1ad00 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c   pTab->pSelect |
1ad10 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  | IsVirtual(pTab
1ad20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1ad30 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66  We reach here if
1ad40 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
1ad50 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76   is a really a v
1ad60 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  iew */.        i
1ad70 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
1ad80 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
1ad90 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
1ada0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1adb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1adc0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
1add0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
1ade0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
1adf0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1ae00 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
1ae10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1ae20 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
1ae30 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
1ae40 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
1ae50 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
1ae60 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
1ae70 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
1ae80 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
1ae90 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
1aea0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
1aeb0 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
1aec0 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
1aed0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1aee0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
1aef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
1af00 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
1af10 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
1af20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
1af30 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
1af40 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1af50 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
1af60 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
1af70 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
1af80 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
1af90 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
1afa0 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
1afb0 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
1afc0 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
1afd0 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
1afe0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
1aff0 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
1b000 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
1b010 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
1b020 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
1b030 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
1b040 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
1b050 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
1b060 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
1b070 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
1b080 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
1b090 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
1b0a0 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
1b0b0 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
1b0c0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
1b0d0 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
1b0e0 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
1b0f0 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
1b100 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
1b110 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
1b120 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
1b130 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
1b140 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
1b150 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
1b160 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
1b170 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
1b180 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
1b190 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
1b1a0 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
1b1b0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
1b1c0 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   k++){.    Expr 
1b1d0 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  *pE = pEList->a[
1b1e0 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
1b1f0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
1b200 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
1b210 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
1b220 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
1b230 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht!=0 );.    ass
1b240 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
1b250 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66  DOT || (pE->pLef
1b260 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66  t!=0 && pE->pLef
1b270 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b  t->op==TK_ID) );
1b280 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
1b290 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
1b2a0 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
1b2b0 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  L ) break;.  }. 
1b2c0 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
1b2d0 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
1b2e0 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
1b2f0 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
1b300 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
1b310 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
1b320 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
1b330 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
1b340 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
1b350 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
1b360 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
1b370 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
1b380 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
1b390 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
1b3a0 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
1b3b0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1b3c0 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
1b3d0 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
1b3e0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
1b3f0 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72  int flags = pPar
1b400 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  se->db->flags;. 
1b410 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73     int longNames
1b420 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1b430 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
1b440 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
1b450 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c            && (fl
1b460 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
1b470 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a  rtColNames)==0;.
1b480 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
1b490 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
1b4a0 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
1b4b0 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72  *pE = a[k].pExpr
1b4c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b4d0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1b4e0 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
1b4f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
1b500 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28  >op!=TK_ALL && (
1b510 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1b520 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  | pE->pRight->op
1b530 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
1b540 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
1b550 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
1b560 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
1b570 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
1b580 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1b590 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1b5a0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1b5b0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
1b5c0 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [k].pExpr);.    
1b5d0 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
1b5e0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1b5f0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
1b600 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
1b610 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ame;.          p
1b620 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
1b630 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b  pr-1].zSpan = a[
1b640 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  k].zSpan;.      
1b650 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
1b660 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b   0;.          a[
1b670 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20  k].zSpan = 0;.  
1b680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b690 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
1b6a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b6b0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
1b6c0 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
1b6d0 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
1b6e0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
1b6f0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
1b700 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
1b710 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
1b720 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
1b730 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
1b740 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
1b750 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20    char *zTName; 
1b760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
1b770 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
1b780 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
1b790 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
1b7a0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
1b7b0 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
1b7c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1b7d0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1b7e0 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
1b7f0 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
1b800 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
1b810 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
1b820 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
1b830 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b840 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30        zTName = 0
1b850 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b860 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
1b870 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
1b880 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1b890 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
1b8a0 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
1b8b0 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
1b8c0 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
1b8d0 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
1b8e0 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
1b8f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
1b900 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  abName==0 ){.   
1b910 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
1b920 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
1b930 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b940 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
1b950 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
1b960 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eak;.          i
1b970 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c  f( zTName && sql
1b980 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
1b990 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
1b9a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b9b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1b9c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b9d0 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20  tableSeen = 1;. 
1b9e0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
1b9f0 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1ba00 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
1ba10 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
1ba20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
1ba30 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
1ba40 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
1ba50 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
1ba60 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d     char *zColnam
1ba70 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75  e;  /* The compu
1ba80 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
1ba90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
1baa0 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20  har *zToFree;   
1bab0 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69  /* Malloced stri
1bac0 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ng that needs to
1bad0 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
1bae0 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73           Token s
1baf0 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d  Colname;  /* Com
1bb00 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
1bb10 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a  e as a token */.
1bb20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1bb30 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
1bb40 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
1bb50 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  ' (currently onl
1bb60 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  y possible.     
1bb70 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69         ** for vi
1bb80 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64  rtual tables), d
1bb90 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74  o not include it
1bba0 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64   in the expanded
1bbb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1bbc0 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e  result-set list.
1bbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1bbf0 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
1bc00 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29  pTab->aCol[j]) )
1bc10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1bc20 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c  assert(IsVirtual
1bc30 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20  (pTab));.       
1bc40 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1bc50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1bc70 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30  i>0 && zTName==0
1bc80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1bc90 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f    if( (pFrom->jo
1bca0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
1bcb0 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RAL)!=0.        
1bcc0 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65          && table
1bcd0 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
1bce0 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d  TabList, i, zNam
1bcf0 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20  e, 0, 0).       
1bd00 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1bd10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
1bd20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
1bd30 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
1bd40 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd60 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  ** table to the 
1bd70 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69  right of the joi
1bd80 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
1bd90 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1bdc0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1bdd0 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e  dex(pFrom->pUsin
1bde0 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be00 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
1be10 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
1be20 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
1be30 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
1be40 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
1be50 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
1be60 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
1be70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
1be80 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1beb0 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
1bec0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
1bed0 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
1bee0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
1bef0 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  olname = zName;.
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
1bf10 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ree = 0;.       
1bf20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
1bf30 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
1bf40 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
1bf50 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
1bf60 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
1bf70 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
1bf80 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
1bf90 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
1bfa0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1bfb0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1bfc0 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
1bfd0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
1bfe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1bff0 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
1c000 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1c010 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
1c020 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1c030 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
1c040 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
1c050 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
1c060 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1c080 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1c090 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1c0a0 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1c0c0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
1c0d0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1c0e0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1c0f0 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
1c100 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
1c110 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  e.z = zColname;.
1c120 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
1c130 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33  name.n = sqlite3
1c140 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d  Strlen30(zColnam
1c150 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1c160 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
1c170 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
1c180 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20  New, &sColname, 
1c190 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1c1a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1c1b0 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  , zToFree);.    
1c1c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c1d0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
1c1e0 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
1c1f0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
1c200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c210 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1c220 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1c230 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
1c240 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1c250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c260 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c270 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
1c280 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
1c290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1c2a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c2b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1c2c0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1c2d0 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
1c2e0 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
1c2f0 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  ew;.  }.#if SQLI
1c300 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
1c310 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  if( p->pEList &&
1c320 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
1c330 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
1c340 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
1c350 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
1c360 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1c370 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
1c380 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
1c390 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
1c3a0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1c3b0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
1c3c0 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
1c3d0 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
1c3e0 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
1c3f0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1c400 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
1c410 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
1c420 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1c430 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
1c440 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
1c450 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
1c460 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
1c470 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
1c480 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1c490 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
1c4a0 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
1c4b0 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
1c4c0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1c4d0 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
1c4e0 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
1c4f0 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
1c500 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
1c510 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61  ser tree..*/.sta
1c520 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b  tic int exprWalk
1c530 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
1c540 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
1c550 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
1c560 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
1c570 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
1c580 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1c590 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
1c5a0 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
1c5b0 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
1c5c0 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
1c5d0 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
1c5e0 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
1c5f0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1c600 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
1c610 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
1c620 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
1c630 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
1c640 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
1c650 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
1c660 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
1c670 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
1c680 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1c690 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
1c6a0 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
1c6b0 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
1c6c0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
1c6d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1c6e0 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
1c6f0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
1c700 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
1c710 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
1c720 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
1c730 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
1c740 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
1c750 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
1c760 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
1c770 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
1c780 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
1c790 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
1c7a0 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
1c7b0 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
1c7c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
1c7d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1c7e0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
1c7f0 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
1c800 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1c810 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
1c820 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
1c830 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
1c840 64 65 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  der;.  w.xExprCa
1c850 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
1c860 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
1c870 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
1c880 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1c890 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a  &w, pSelect);.}.
1c8a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c8b0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
1c8c0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57  *.** This is a W
1c8d0 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
1c8e0 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66  lback callback f
1c8f0 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65  or the sqlite3Se
1c900 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a  lectTypeInfo().*
1c910 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  * interface..**.
1c920 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d  ** For each FROM
1c930 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1c940 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79  , add Column.zTy
1c950 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43  pe and Column.zC
1c960 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  oll.** informati
1c970 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  on to the Table 
1c980 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
1c990 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
1c9a0 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74  sult set.** of t
1c9b0 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  hat subquery..**
1c9c0 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
1c9d0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
1c9e0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
1c9f0 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74  lt set was const
1ca00 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c  ructed.** by sel
1ca10 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75  ectExpander() bu
1ca20 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63  t the type and c
1ca30 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
1ca40 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64  tion was omitted
1ca50 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e  .** at that poin
1ca60 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69  t because identi
1ca70 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65  fiers had not ye
1ca80 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  t been resolved.
1ca90 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
1caa0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
1cab0 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73  r identifier res
1cac0 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
1cad0 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64  ic int selectAdd
1cae0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
1caf0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1cb00 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1cb10 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
1cb20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
1cb30 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
1cb40 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1cb50 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
1cb60 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
1cb70 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
1cb80 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  );.  if( (p->sel
1cb90 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
1cba0 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20  peInfo)==0 ){.  
1cbb0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
1cbc0 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b   SF_HasTypeInfo;
1cbd0 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57  .    pParse = pW
1cbe0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
1cbf0 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
1cc00 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69  >pSrc;.    for(i
1cc10 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
1cc20 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
1cc30 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
1cc40 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61  rom++){.      Ta
1cc50 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
1cc60 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  m->pTab;.      i
1cc70 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d  f( ALWAYS(pTab!=
1cc80 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  0) && (pTab->tab
1cc90 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
1cca0 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  eral)!=0 ){.    
1ccb0 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
1ccc0 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
1ccd0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1cce0 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c  T */.        Sel
1ccf0 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
1cd00 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
1cd10 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
1cd20 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   );.        whil
1cd30 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
1cd40 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  ) pSel = pSel->p
1cd50 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73  Prior;.        s
1cd60 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
1cd70 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
1cd80 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f  Parse, pTab->nCo
1cd90 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70  l, pTab->aCol, p
1cda0 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
1cdb0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1cdc0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1cdd0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1cde0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
1cdf0 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
1ce00 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1ce10 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
1ce20 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
1ce30 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
1ce40 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1ce50 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
1ce60 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1ce70 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
1ce80 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
1ce90 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
1cea0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1ceb0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
1cec0 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
1ced0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
1cee0 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
1cef0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1cf00 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
1cf10 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
1cf20 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64  back = selectAdd
1cf30 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
1cf40 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
1cf50 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
1cf60 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
1cf70 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
1cf80 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
1cf90 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69   pSelect);.#endi
1cfa0 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f.}.../*.** This
1cfb0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 6f 66   routine sets of
1cfc0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1cfd0 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
1cfe0 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ng.  The.** foll
1cff0 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c  owing is accompl
1d000 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ished:.**.**    
1d010 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20   *  VDBE Cursor 
1d020 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69  numbers are assi
1d030 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d  gned to all FROM
1d040 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a  -clause terms..*
1d050 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72  *     *  Ephemer
1d060 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73  al Table objects
1d070 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
1d080 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
1d090 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
1d0a0 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53      *  ON and US
1d0b0 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
1d0c0 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45  shifted into WHE
1d0d0 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  RE statements.**
1d0e0 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64       *  Wildcard
1d0f0 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45  s "*" and "TABLE
1d100 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65  .*" in result se
1d110 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e  ts are expanded.
1d120 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74  .**     *  Ident
1d130 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73  ifiers in expres
1d140 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64  sion are matched
1d150 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   to tables..**.*
1d160 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1d170 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20  cts recursively 
1d180 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65  on all subquerie
1d190 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c  s within the SEL
1d1a0 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
1d1b0 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a  ite3SelectPrep(.
1d1c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1d1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d1e0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
1d1f0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1d200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d210 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1d220 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
1d230 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
1d240 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e   *pOuterNC  /* N
1d250 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
1d260 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a  container */.){.
1d270 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1d280 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
1d290 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
1d2a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1d2b0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
1d2c0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
1d2d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1d2e0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
1d2f0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
1d300 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1d310 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1d320 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
1d330 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
1d340 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
1d350 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
1d360 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1d370 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1d380 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
1d390 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1d3a0 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
1d3b0 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
1d3c0 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
1d3d0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1d3e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
1d3f0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1d400 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
1d410 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
1d420 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
1d430 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
1d440 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
1d450 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
1d460 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69  is.** routine si
1d470 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c  mply stores NULL
1d480 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73  s in all of thos
1d490 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a  e memory cells..
1d4a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1d4b0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
1d4c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
1d4d0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1d4e0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d4f0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1d500 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1d510 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
1d520 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49  unc;.  if( pAggI
1d530 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49  nfo->nFunc+pAggI
1d540 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20  nfo->nColumn==0 
1d550 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1d560 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1d570 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
1d580 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  n; i++){.    sql
1d590 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d5a0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41  , OP_Null, 0, pA
1d5b0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
1d5c0 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  iMem);.  }.  for
1d5d0 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
1d5e0 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
1d5f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
1d600 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
1d610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d620 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1d630 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29   0, pFunc->iMem)
1d640 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  ;.    if( pFunc-
1d650 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
1d660 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
1d670 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
1d680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1d690 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d6a0 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
1d6b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
1d6c0 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
1d6d0 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
1d6e0 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
1d6f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d700 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
1d710 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
1d720 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
1d730 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
1d740 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
1d750 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
1d760 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
1d770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d780 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1d790 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
1d7a0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1d7b0 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  , pE->x.pList);.
1d7c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1d7d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1d7e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
1d7f0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
1d800 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
1d830 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
1d840 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  DOFF);.      }. 
1d850 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1d860 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
1d870 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
1d880 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
1d890 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
1d8a0 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
1d8b0 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
1d8c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
1d8d0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
1d8e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d8f0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1d900 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1d910 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1d920 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1d930 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1d940 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
1d950 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1d960 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1d970 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
1d980 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1d990 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
1d9a0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
1d9b0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1d9c0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
1d9d0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1d9e0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
1d9f0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1da00 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
1da10 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
1da20 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c  t->nExpr : 0, 0,
1da30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1da40 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
1da50 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
1da60 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
1da70 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
1da80 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
1da90 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
1daa0 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
1dab0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
1dac0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
1dad0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1dae0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
1daf0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1db00 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1db10 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
1db20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1db30 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1db40 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
1db50 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
1db60 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
1db70 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
1db80 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 73 71 6c  tMode = 1;.  sql
1db90 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
1dba0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
1dbb0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
1dbc0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
1dbd0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1dbe0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
1dbf0 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
1dc00 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
1dc10 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
1dc20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1dc30 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
1dc40 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
1dc50 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1dc60 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
1dc70 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1dc80 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
1dc90 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70  {.      nArg = p
1dca0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1dcb0 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69     regAgg = sqli
1dcc0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1dcd0 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20  pParse, nArg);. 
1dce0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1dcf0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
1dd00 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41  rse, pList, regA
1dd10 67 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  gg, 0);.    }els
1dd20 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
1dd30 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
1dd40 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1dd50 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
1dd60 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
1dd70 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
1dd80 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1dd90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1dda0 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
1ddb0 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
1ddc0 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
1ddd0 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
1dde0 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
1ddf0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
1de00 63 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  c->flags & SQLIT
1de10 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
1de20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
1de30 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
1de40 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1de50 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1de60 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1de70 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
1de80 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
1de90 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
1dea0 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
1deb0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
1dec0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
1ded0 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
1dee0 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
1def0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
1df00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1df10 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
1df20 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
1df30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
1df40 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
1df50 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
1df60 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1df70 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1df80 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1df90 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
1dfa0 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
1dfb0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
1dfc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1dfd0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1dfe0 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20   OP_AggStep, 0, 
1dff0 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
1e000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e010 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1e020 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
1e030 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
1e040 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1e050 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20  , (u8)nArg);.   
1e060 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e070 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1e080 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
1e090 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
1e0a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
1e0b0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
1e0c0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
1e0d0 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
1e0e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1e0f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
1e100 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
1e110 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e120 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
1e130 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
1e140 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67  efore populating
1e150 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
1e160 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61   registers, clea
1e170 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  r the column cac
1e180 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  he..  ** Otherwi
1e190 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68  se, if any of th
1e1a0 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d  e required colum
1e1b0 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72  n values are alr
1e1c0 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20  eady present .  
1e1d0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c  ** in registers,
1e1e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e1f0 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43  () may use OP_SC
1e200 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  opy to copy the 
1e210 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43  value.  ** to pC
1e220 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74  ->iMem. But by t
1e230 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75  he time the valu
1e240 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f  e is used, the o
1e250 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72  riginal register
1e260 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62  .  ** may have b
1e270 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69  een used, invali
1e280 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72  dating the under
1e290 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c  lying buffer hol
1e2a0 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65  ding the.  ** te
1e2b0 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65  xt or blob value
1e2c0 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38  . See ticket [88
1e2d0 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a  3034dcb5]..  **.
1e2e0 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c    ** Another sol
1e2f0 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74  ution would be t
1e300 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  o change the OP_
1e310 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f  SCopy used to co
1e320 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76  py cached.  ** v
1e330 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43  alues to an OP_C
1e340 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  opy..  */.  sqli
1e350 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
1e360 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
1e370 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66  (i=0, pC=pAggInf
1e380 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49  o->aCol; i<pAggI
1e390 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
1e3a0 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20  r; i++, pC++){. 
1e3b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1e3c0 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70  de(pParse, pC->p
1e3d0 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b  Expr, pC->iMem);
1e3e0 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d  .  }.  pAggInfo-
1e3f0 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b  >directMode = 0;
1e400 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1e410 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
1e420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1e430 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
1e440 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1e450 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
1e460 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
1e470 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
1e480 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69  re distributed i
1e490 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64  n various ways d
1e4a0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a  epending on the.
1e4b0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1e4c0 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74  he SelectDest st
1e4d0 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
1e4e0 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70  to by argument p
1e4f0 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f  Dest.** as follo
1e500 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44  ws:.**.**     pD
1e510 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65  est->eDest    Re
1e520 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
1e530 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
1e540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e560 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
1e570 52 54 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47  RT_Output      G
1e580 65 6e 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66  enerate a row of
1e590 20 6f 75 74 70 75 74 20 28 75 73 69 6e 67 20 74   output (using t
1e5a0 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a  he OP_ResultRow.
1e5b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e5c0 20 20 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66         opcode) f
1e5d0 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74  or each row in t
1e5e0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
1e5f0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
1e600 20 20 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61           Only va
1e610 6c 69 64 20 69 66 20 74 68 65 20 72 65 73 75 6c  lid if the resul
1e620 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f  t is a single co
1e630 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  lumn..**        
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f               Sto
1e650 72 65 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c  re the first col
1e660 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  umn of the first
1e670 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20   result row.**  
1e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e690 20 20 20 69 6e 20 72 65 67 69 73 74 65 72 20 70     in register p
1e6a0 44 65 73 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e  Dest->iParm then
1e6b0 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 65 73   abandon the res
1e6c0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1e6d0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1e6e0 71 75 65 72 79 2e 20 20 54 68 69 73 20 64 65 73  query.  This des
1e6f0 74 69 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73  tination implies
1e700 20 22 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a   "LIMIT 1"..**.*
1e710 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20  *     SRT_Set   
1e720 20 20 20 20 20 20 54 68 65 20 72 65 73 75 6c 74        The result
1e730 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c   must be a singl
1e740 65 20 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65  e column.  Store
1e750 20 65 61 63 68 0a 2a 2a 20 20 20 20 20 20 20 20   each.**        
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77               row
1e770 20 6f 66 20 72 65 73 75 6c 74 20 61 73 20 74 68   of result as th
1e780 65 20 6b 65 79 20 69 6e 20 74 61 62 6c 65 20 70  e key in table p
1e790 44 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a  Dest->iParm. .**
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7b0 20 20 20 20 20 41 70 70 6c 79 20 74 68 65 20 61       Apply the a
1e7c0 66 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61  ffinity pDest->a
1e7d0 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73  ffinity before s
1e7e0 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  toring.**       
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1e800 73 75 6c 74 73 2e 20 20 55 73 65 64 20 74 6f 20  sults.  Used to 
1e810 69 6d 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53  implement "IN (S
1e820 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a  ELECT ...)"..**.
1e830 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
1e840 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
1e850 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
1e860 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
1e870 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e  le pDest->iParm.
1e880 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
1e890 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76  xcept      Remov
1e8a0 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74  e results from t
1e8b0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1e8c0 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e  le pDest->iParm.
1e8d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54  .**.**     SRT_T
1e8e0 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65  able       Store
1e8f0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70   results in temp
1e900 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
1e910 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20  t->iParm..**    
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e930 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52   This is like SR
1e940 54 5f 45 70 68 65 6d 54 61 62 20 65 78 63 65 70  T_EphemTab excep
1e950 74 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  t that the table
1e960 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1e970 20 20 20 20 20 20 20 20 69 73 20 61 73 73 75 6d          is assum
1e980 65 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65  ed to already be
1e990 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   open..**.**    
1e9a0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20   SRT_EphemTab   
1e9b0 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f   Create an tempo
1e9c0 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
1e9d0 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72  ->iParm and stor
1e9e0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1e9f0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73           the res
1ea00 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20 63  ult there. The c
1ea10 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70  ursor is left op
1ea20 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20  en after.**     
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 72 65 74 75 72 6e 69 6e 67 2e 20 20 54 68 69 73  returning.  This
1ea50 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 54 61 62   is like SRT_Tab
1ea60 6c 65 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a  le except that.*
1ea70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1ea80 20 20 20 20 20 20 74 68 69 73 20 64 65 73 74 69        this desti
1ea90 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f  nation uses OP_O
1eaa0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f 20  penEphemeral to 
1eab0 63 72 65 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  create.**       
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1ead0 65 20 74 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a  e table first..*
1eae0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72  *.**     SRT_Cor
1eaf0 6f 75 74 69 6e 65 20 20 20 47 65 6e 65 72 61 74  outine   Generat
1eb00 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  e a co-routine t
1eb10 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65  hat returns a ne
1eb20 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20  w row of.**     
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 72 65 73 75 6c 74 73 20 65 61 63 68 20 74 69 6d  results each tim
1eb50 65 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e  e it is invoked.
1eb60 20 20 54 68 65 20 65 6e 74 72 79 20 70 6f 69 6e    The entry poin
1eb70 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1eb80 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1eb90 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 73 74  co-routine is st
1eba0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
1ebb0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1ebc0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69  *.**     SRT_Exi
1ebd0 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20 61  sts      Store a
1ebe0 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c   1 in memory cel
1ebf0 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 69  l pDest->iParm i
1ec00 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  f the result.** 
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65      set is not e
1ec30 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mpty..**.**     
1ec40 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20  SRT_Discard     
1ec50 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74  Throw the result
1ec60 73 20 61 77 61 79 2e 20 20 54 68 69 73 20 69 73  s away.  This is
1ec70 20 75 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a   used by SELECT.
1ec80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1ec90 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
1eca0 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72  s within trigger
1ecb0 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72  s whose only pur
1ecc0 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20  pose is.**      
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1ece0 68 65 20 73 69 64 65 2d 65 66 66 65 63 74 73 20  he side-effects 
1ecf0 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  of functions..**
1ed00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ed10 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
1ed20 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
1ed30 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
1ed40 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
1ed50 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
1ed60 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
1ed70 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
1ed80 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
1ed90 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
1eda0 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
1edb0 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
1edc0 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
1edd0 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
1ede0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
1edf0 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
1ee00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
1ee10 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
1ee20 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
1ee30 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
1ee40 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1ee50 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1ee60 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
1ee70 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
1ee80 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
1ee90 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
1eea0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
1eeb0 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
1eec0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
1eed0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
1eee0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1eef0 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
1ef00 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
1ef10 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
1ef20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1ef30 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
1ef40 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1ef50 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
1ef60 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
1ef70 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1ef80 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
1ef90 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1efa0 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
1efb0 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
1efc0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1efd0 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
1efe0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
1eff0 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
1f000 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1f010 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
1f020 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
1f030 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
1f040 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
1f050 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1f060 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1f070 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
1f080 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
1f090 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1f0a0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
1f0b0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
1f0c0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
1f0d0 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
1f0e0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
1f0f0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
1f100 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
1f110 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
1f120 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
1f130 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
1f140 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
1f150 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1f160 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
1f170 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
1f180 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
1f190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1f1a0 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
1f1b0 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
1f1c0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
1f1d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1f1e0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
1f1f0 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
1f200 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f   */.  int addrSo
1f210 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20  rtIndex;     /* 
1f220 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50  Address of an OP
1f230 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
1f240 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1f250 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
1f260 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
1f270 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
1f280 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
1f290 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1f2b0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
1f2c0 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
1f2d0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
1f2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f2f0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1f300 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d  ction */..  db =
1f310 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1f320 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
1f330 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
1f340 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
1f350 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1f360 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1f370 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1f380 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
1f390 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
1f3a0 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
1f3b0 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
1f3c0 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20  f(sAggInfo));.. 
1f3d0 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
1f3e0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
1f3f0 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
1f400 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
1f410 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
1f420 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
1f430 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
1f440 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1f450 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
1f460 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
1f470 61 72 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ard);.    /* If 
1f480 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
1f490 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
1f4a0 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
1f4b0 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
1f4c0 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
1f4d0 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
1f4e0 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
1f4f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1f500 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
1f510 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
1f520 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
1f530 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
1f540 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
1f550 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
1f560 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
1f570 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
1f580 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
1f590 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
1f5a0 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
1f5b0 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
1f5c0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1f5d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1f5e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
1f5f0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73  ct_end;.  }.  is
1f600 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  Agg = (p->selFla
1f610 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
1f620 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28  e)!=0;.  assert(
1f630 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20   pEList!=0 );.. 
1f640 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
1f650 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ting code..  */.
1f660 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1f670 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1f680 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
1f690 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
1f6a0 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
1f6b0 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
1f6c0 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
1f6d0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
1f6e0 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
1f6f0 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ut..  */.#ifndef
1f700 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1f710 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63  QUERY.  if( chec
1f720 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
1f730 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
1f740 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74  e, pDest, pEList
1f750 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
1f760 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1f770 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1f780 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1f790 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
1f7a0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
1f7b0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
1f7c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1f7d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1f7e0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1f7f0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
1f800 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69  or(i=0; !p->pPri
1f810 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74  or && i<pTabList
1f820 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
1f830 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f840 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1f850 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
1f860 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
1f870 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  est;.    Select 
1f880 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pSub = pItem->p
1f890 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20  Select;.    int 
1f8a0 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69  isAggSub;..    i
1f8b0 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 70 49  f( pSub==0 || pI
1f8c0 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
1f8d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
1f8e0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
1f8f0 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
1f900 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
1f910 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
1f920 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
1f930 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74   refered to by t
1f940 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
1f950 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
1f960 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
1f970 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
1f980 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
1f990 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
1f9a0 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
1f9b0 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
1f9c0 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
1f9d0 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
1f9e0 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
1f9f0 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
1fa00 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
1fa10 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
1fa20 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
1fa30 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
1fa40 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
1fa50 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
1fa60 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
1fa70 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
1fa80 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1fa90 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
1faa0 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 74 68  absorbed into th
1fab0 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
1fac0 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75   isAggSub = (pSu
1fad0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1fae0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
1faf0 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
1fb00 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
1fb10 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41  p, i, isAgg, isA
1fb20 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  ggSub) ){.      
1fb30 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a  if( isAggSub ){.
1fb40 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20          isAgg = 
1fb50 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  1;.        p->se
1fb60 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
1fb70 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a  regate;.      }.
1fb80 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
1fb90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1fba0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1fbb0 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
1fbc0 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d  EphemTab, pItem-
1fbd0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
1fbe0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1fbf0 69 73 50 6f 70 75 6c 61 74 65 64 3d 3d 30 20 29  isPopulated==0 )
1fc00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
1fc10 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
1fc20 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
1fc30 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c    pItem->isPopul
1fc40 61 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ated = 1;.    }.
1fc50 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65      if( /*pParse
1fc60 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e  ->nErr ||*/ db->
1fc70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1fc80 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1fc90 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
1fca0 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
1fcb0 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
1fcc0 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
1fcd0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
1fce0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
1fcf0 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
1fd00 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
1fd10 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
1fd20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
1fd30 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
1fd40 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66  ->pEList;.#endif
1fd50 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
1fd60 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
1fd70 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
1fd80 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
1fd90 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73  pHaving;.  isDis
1fda0 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  tinct = (p->selF
1fdb0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1fdc0 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66  ct)!=0;..#ifndef
1fdd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
1fde0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
1fdf0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
1fe00 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
1fe10 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
1fe20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
1fe30 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
1fe40 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1fe50 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
1fe60 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65  t==0 ){.      Se
1fe70 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52  lect *pLoop, *pR
1fe80 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
1fe90 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
1fea0 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b     int mxSelect;
1feb0 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  .      for(pLoop
1fec0 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
1fed0 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20  =pLoop->pPrior, 
1fee0 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  cnt++){.        
1fef0 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73  pLoop->pRightmos
1ff00 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70  t = p;.        p
1ff10 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52  Loop->pNext = pR
1ff20 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52  ight;.        pR
1ff30 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  ight = pLoop;.  
1ff40 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65      }.      mxSe
1ff50 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  lect = db->aLimi
1ff60 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
1ff70 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b  OMPOUND_SELECT];
1ff80 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c  .      if( mxSel
1ff90 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c  ect && cnt>mxSel
1ffa0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
1ffb0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ffc0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
1ffd0 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75   terms in compou
1ffe0 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20  nd SELECT");.   
1fff0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
20000 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
20010 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
20020 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
20030 44 65 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Dest);.  }.#endi
20040 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69  f..  /* If possi
20050 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68 65  ble, rewrite the
20060 20 71 75 65 72 79 20 74 6f 20 75 73 65 20 47 52   query to use GR
20070 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f  OUP BY instead o
20080 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a  f DISTINCT..  **
20090 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20   GROUP BY might 
200a0 75 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49  use an index, DI
200b0 53 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65  STINCT never doe
200c0 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
200d0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
200e0 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
200f0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
20100 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 2d  !=0 );.  if( (p-
20110 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
20120 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
20130 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
20140 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  inct ){.    p->p
20150 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
20160 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
20170 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a   p->pEList, 0);.
20180 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
20190 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
201a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
201b0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20  SF_Distinct;.   
201c0 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b   isDistinct = 0;
201d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
201e0 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
201f0 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
20200 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
20210 64 20 74 68 65 79 20 61 72 65 0a 20 20 2a 2a 20  d they are.  ** 
20220 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20  identical, then 
20230 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45  disable the ORDE
20240 52 20 42 59 20 63 6c 61 75 73 65 20 73 69 6e 63  R BY clause sinc
20250 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 0a 20  e the GROUP BY. 
20260 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 20 65   ** will cause e
20270 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20  lements to come 
20280 6f 75 74 20 69 6e 20 74 68 65 20 63 6f 72 72 65  out in the corre
20290 63 74 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ct order.  This 
202a0 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d  is.  ** an optim
202b0 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f  ization - the co
202c0 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f  rrect answer sho
202d0 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72  uld result regar
202e0 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20  dless..  ** Use 
202f0 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  the SQLITE_Group
20300 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74  ByOrder flag wit
20310 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  h SQLITE_TESTCTR
20320 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a  L_OPTIMIZER.  **
20330 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 69 73   to disable this
20340 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
20350 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
20360 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  es..  */.  if( s
20370 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
20380 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f 75 70 42  mpare(p->pGroupB
20390 79 2c 20 70 4f 72 64 65 72 42 79 29 3d 3d 30 0a  y, pOrderBy)==0.
203a0 20 20 20 20 20 20 20 20 20 26 26 20 28 64 62 2d           && (db-
203b0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
203c0 47 72 6f 75 70 42 79 4f 72 64 65 72 29 3d 3d 30  GroupByOrder)==0
203d0 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
203e0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
203f0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
20400 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
20410 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e  then this sortin
20420 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67  g.  ** index mig
20430 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
20440 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
20450 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20  ta can be .  ** 
20460 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
20470 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20  -sorted order.  
20480 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
20490 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ase, then the.  
204a0 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  ** OP_OpenEpheme
204b0 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
204c0 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
204d0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
204e0 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72  ce.  ** we figur
204f0 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
20500 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  orting index is 
20510 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
20520 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20   addrSortIndex. 
20530 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
20540 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
20550 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  te that change..
20560 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
20570 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
20580 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
20590 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
205a0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
205b0 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
205c0 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  y);.    pOrderBy
205d0 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  ->iECursor = pPa
205e0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
205f0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
20600 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e  [2] = addrSortIn
20610 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
20620 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
20630 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
20640 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
20660 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
20670 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
20680 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  r+2, 0,.        
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206a0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
206b0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
206c0 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65  ANDOFF);.  }else
206d0 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e  {.    addrSortIn
206e0 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
206f0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
20700 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
20710 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
20720 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
20730 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
20740 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
20750 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
20760 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20770 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
20780 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
20790 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  >iParm, pEList->
207a0 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
207b0 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
207c0 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
207d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
207e0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
207f0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
20800 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
20810 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61  d);..  /* Open a
20820 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
20830 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
20840 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
20850 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63  .  if( isDistinc
20860 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  t ){.    KeyInfo
20870 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
20880 61 73 73 65 72 74 28 20 69 73 41 67 67 20 7c 7c  assert( isAgg ||
20890 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20   pGroupBy );.   
208a0 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72   distinct = pPar
208b0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
208c0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
208d0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
208e0 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
208f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
20900 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
20910 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69  penEphemeral, di
20920 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
20950 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
20960 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
20970 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
20980 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
20990 52 44 45 52 45 44 29 3b 0a 20 20 7d 65 6c 73 65  RDERED);.  }else
209a0 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
209b0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41   -1;.  }..  /* A
209c0 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e  ggregate and non
209d0 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
209e0 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64  es are handled d
209f0 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20  ifferently */.  
20a00 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47  if( !isAgg && pG
20a10 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
20a20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69 73   /* This case is
20a30 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61   for non-aggrega
20a40 74 65 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a  te queries.    *
20a50 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
20a60 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f  base scan.    */
20a70 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
20a80 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
20a90 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
20aa0 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65  , pWhere, &pOrde
20ab0 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  rBy, 0);.    if(
20ac0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
20ad0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
20ae0 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
20af0 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
20b00 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
20b10 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
20b20 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
20b30 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
20b40 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
20b50 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
20b60 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
20b70 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
20b80 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
20b90 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53  */.    if( addrS
20ba0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70  ortIndex>=0 && p
20bb0 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
20bc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
20bd0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
20be0 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29  ddrSortIndex, 1)
20bf0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
20c00 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
20c10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
20c20 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
20c30 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a  inner loop.    *
20c40 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21 69 73  /.    assert(!is
20c50 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 20 20 73  Distinct);.    s
20c60 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
20c70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
20c80 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
20c90 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20 20 20  , -1, pDest,.   
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cb0 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
20cc0 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
20cd0 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  ak);..    /* End
20ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
20cf0 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
20d00 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
20d10 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
20d20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
20d30 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73  s is the process
20d40 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
20d50 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20  e queries */.   
20d60 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
20d70 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
20d80 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
20d90 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
20da0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
20db0 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
20dc0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
20dd0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
20de0 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
20df0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
20e00 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
20e10 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
20e20 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
20e30 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
20e40 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
20e50 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
20e60 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
20e70 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
20e80 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ea0 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
20eb0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
20ec0 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
20ed0 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
20f00 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
20f10 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
20f20 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
20f30 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
20f40 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
20f50 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
20f60 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
20f70 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
20f80 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
20f90 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
20fa0 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
20fb0 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
20fc0 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
20fd0 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  T */..    /* Rem
20fe0 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
20ff0 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
21000 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
21010 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
21020 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
21030 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
21040 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
21050 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21070 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
21080 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
21090 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
210a0 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
210b0 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
210c0 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
210d0 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
210e0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
210f0 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
21100 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
21110 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
21120 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
21130 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
21140 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
21150 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
21160 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
21170 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
21180 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41         pItem->iA
21190 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
211a0 7d 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f  }.    }.. .    /
211b0 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
211c0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
211d0 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
211e0 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
211f0 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
21200 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
21210 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
21220 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
21230 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
21240 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
21250 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
21260 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
21270 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
21280 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
21290 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
212a0 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
212b0 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
212c0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
212d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
212e0 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
212f0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
21300 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
21310 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
21320 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
21330 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49  gInfo;.    sAggI
21340 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
21350 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
21360 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
21370 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  1 : 0;.    sAggI
21380 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
21390 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
213a0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
213b0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
213c0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
213d0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
213e0 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
213f0 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
21400 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
21410 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
21420 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
21430 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
21440 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
21450 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
21460 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
21470 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
21480 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
21490 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
214a0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
214b0 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ty(sAggInfo.aFun
214c0 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  c[i].pExpr, EP_x
214d0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
214e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
214f0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
21500 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
21510 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
21520 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
21530 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
21540 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
21550 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
21560 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
21570 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
21580 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
21590 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
215a0 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
215b0 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
215c0 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
215d0 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
215e0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
215f0 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
21600 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
21610 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
21620 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
21630 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
21640 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20  .      int j1;  
21650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d             /* A-
21660 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
21670 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
21680 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
21690 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
216a0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
216b0 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
216c0 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
216d0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
216e0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
216f0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
21700 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
21710 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
21720 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
21730 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
21740 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
21750 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
21760 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
21770 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
21780 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
21790 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
217a0 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
217b0 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
217c0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
217d0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
217e0 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
217f0 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
21800 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
21810 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
21820 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
21830 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
21840 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
21850 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
21860 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
21870 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
21880 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
21890 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
218a0 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
218b0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
218c0 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
218d0 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
218e0 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
218f0 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
21900 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
21910 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
21920 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e  er all, the Open
21930 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
21940 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
21950 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
21960 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
21970 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
21980 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
21990 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
219a0 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
219b0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
219c0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
219d0 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
219e0 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
219f0 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  x = sqlite3VdbeA
21a00 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
21a10 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20  Ephemeral, .    
21a20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
21a30 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
21a40 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
21a50 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
21a60 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
21a70 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
21a80 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f  NDOFF);..      /
21a90 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
21aa0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73  ory locations us
21ab0 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61  ed by GROUP BY a
21ac0 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73  ggregate process
21ad0 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
21ae0 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b     iUseFlag = ++
21af0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
21b00 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d      iAbortFlag =
21b10 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
21b20 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74  .      regOutput
21b30 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Row = ++pParse->
21b40 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
21b50 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
21b60 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
21b70 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65  (v);.      regRe
21b80 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
21b90 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
21ba0 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
21bb0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
21bc0 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
21bd0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
21be0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
21bf0 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
21c00 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42  >nExpr;.      iB
21c10 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
21c20 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
21c30 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
21c40 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
21c50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21c60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
21c70 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46  eger, 0, iAbortF
21c80 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
21c90 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65  Comment((v, "cle
21ca0 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ar abort flag"))
21cb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21cc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21cd0 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65  Integer, 0, iUse
21ce0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
21cf0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
21d00 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74  dicate accumulat
21d10 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 0a 20 20  or empty"));..  
21d20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
21d30 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
21d40 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
21d50 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
21d60 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
21d70 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
21d80 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
21d90 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
21da0 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
21db0 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
21dc0 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
21dd0 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
21de0 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
21df0 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
21e00 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
21e10 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
21e20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
21e30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
21e40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21e50 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
21e60 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
21e70 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
21e80 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
21e90 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
21ea0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
21eb0 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20  GroupBy, 0);.   
21ec0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
21ed0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
21ee0 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47  nd;.      if( pG
21ef0 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
21f00 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
21f10 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
21f20 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
21f30 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
21f40 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
21f50 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
21f60 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
21f70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  enEphemeral tabl
21f80 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
21f90 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
21fa0 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
21fb0 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
21fc0 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
21fd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21fe0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
21ff0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
22000 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
22010 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
22020 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
22030 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
22040 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
22050 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
22060 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
22070 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
22080 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
22090 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
220a0 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
220b0 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
220c0 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
220d0 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
220e0 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
220f0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
22100 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
22110 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22120 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20  int regBase;.   
22130 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f       int regReco
22140 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rd;.        int 
22150 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  nCol;.        in
22160 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20  t nGroupBy;..   
22170 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
22180 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
22190 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
221a0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
221b0 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
221c0 79 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a  y + 1;.        j
221d0 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20   = nGroupBy+1;. 
221e0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
221f0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
22200 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
22210 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f      if( sAggInfo
22220 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72  .aCol[i].iSorter
22230 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
22240 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b           nCol++;
22250 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
22260 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22280 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
22290 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
222a0 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  arse, nCol);.   
222b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
222c0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
222d0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
222e0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
222f0 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
22300 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30  upBy, regBase, 0
22310 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22320 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22330 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67  OP_Sequence, sAg
22340 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
22350 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42  ,regBase+nGroupB
22360 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  y);.        j = 
22370 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20  nGroupBy+1;.    
22380 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
22390 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
223a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
223b0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
223c0 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67  col *pCol = &sAg
223d0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20  gInfo.aCol[i];. 
223e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
223f0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
22400 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
22410 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20     int r1 = j + 
22420 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
22430 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20       int r2;..  
22440 20 20 20 20 20 20 20 20 20 20 72 32 20 3d 20 73            r2 = s
22450 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
22460 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
22470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c  pCol->pTab, pCol
224a0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d  ->iColumn, pCol-
224b0 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20  >iTable, r1);.  
224c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
224d0 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20  !=r2 ){.        
224e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
224f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
22500 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20  opy, r2, r1);.  
22510 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22520 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
22530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22540 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
22550 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
22560 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
22570 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22580 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
22590 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
225a0 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
225b0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
225c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
225d0 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
225e0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
225f0 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
22600 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
22610 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22620 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
22630 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
22640 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
22650 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
22660 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
22670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
22680 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
22690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
226a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
226b0 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
226c0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
226d0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
226e0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
226f0 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a  OUP BY sort"));.
22700 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
22710 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
22720 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
22730 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
22740 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
22750 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61   }..      /* Eva
22760 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  luate the curren
22770 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
22780 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30   and store in b0
22790 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20  , b1, b2....    
227a0 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f    ** (b0 is memo
227b0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65  ry location iBMe
227c0 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d  m+0, b1 is iBMem
227d0 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  +1, and so forth
227e0 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ).      ** Then 
227f0 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72  compare the curr
22800 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
22810 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47  ms against the G
22820 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20  ROUP BY terms.  
22830 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
22840 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72  previous row cur
22850 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
22860 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20   a0, a1, a2.... 
22870 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
22880 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71  drTopOfLoop = sq
22890 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
228a0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
228b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
228c0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
228d0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
228e0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
228f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
22900 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
22910 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22920 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
22930 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49  OP_Column, sAggI
22940 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
22950 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  j, iBMem+j);.   
22960 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22970 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64        sAggInfo.d
22980 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
22990 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
229a0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
229b0 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e   pGroupBy->a[j].
229c0 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b  pExpr, iBMem+j);
229d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
229e0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
229f0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
22a00 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c  _Compare, iAMem,
22a10 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iBMem, pGroupBy
22a20 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a40 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
22a50 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
22a60 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  .      j1 = sqli
22a70 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
22a80 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
22a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
22aa0 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c  , OP_Jump, j1+1,
22ab0 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20   0, j1+1);..    
22ac0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
22ad0 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  de that runs whe
22ae0 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20  never the GROUP 
22af0 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20  BY changes..    
22b00 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20    ** Changes in 
22b10 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65  the GROUP BY are
22b20 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
22b30 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
22b40 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20       ** block.  
22b50 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
22b60 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62   changes, this b
22b70 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e  lock is skipped.
22b80 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22b90 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70  ** This code cop
22ba0 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75  ies current grou
22bb0 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30  p by terms in b0
22bc0 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20  ,b1,b2,....     
22bd0 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61   ** over to a0,a
22be0 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63  1,a2.  It then c
22bf0 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20  alls the output 
22c00 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
22c10 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74   ** and resets t
22c20 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
22c30 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
22c40 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  rs in preparatio
22c50 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  n.      ** for t
22c60 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59  he next GROUP BY
22c70 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f   batch..      */
22c80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
22c90 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
22ca0 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c  e, iBMem, iAMem,
22cb0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
22cc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22cd0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22ce0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
22cf0 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
22d00 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
22d10 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
22d20 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
22d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22d40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
22d50 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c  Pos, iAbortFlag,
22d60 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
22d70 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22d80 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c   "check abort fl
22d90 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
22da0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22db0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
22dc0 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
22dd0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
22de0 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61  ent((v, "reset a
22df0 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
22e00 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
22e10 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
22e20 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
22e30 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
22e40 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
22e50 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
22e60 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
22e70 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
22e80 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64  , j1);.      upd
22e90 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
22ea0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
22eb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22ec0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22ed0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
22ee0 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
22ef0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
22f00 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
22f10 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
22f20 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
22f30 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
22f40 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
22f50 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
22f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22f70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
22f80 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
22f90 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66  ngIdx, addrTopOf
22fa0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Loop);.      }el
22fb0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
22fc0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
22fd0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
22fe0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
22ff0 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
23000 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20 20 20  ingIdx, 1);.    
23010 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75    }..      /* Ou
23020 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72  tput the final r
23030 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20  ow of result.   
23040 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
23050 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23060 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
23070 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
23080 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
23090 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
230a0 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77  output final row
230b0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a  "));..      /* J
230c0 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62  ump over the sub
230d0 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a  routines.      *
230e0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
230f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23100 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64  Goto, 0, addrEnd
23110 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
23120 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
23130 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
23140 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
23150 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
23160 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73   ** set.  This s
23170 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20  ubroutine first 
23180 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73  looks at the iUs
23190 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46  eFlag.  If iUseF
231a0 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
231b0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
231c0 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20  al to zero, the 
231d0 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20  subroutine is a 
231e0 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20  no-op.  If.     
231f0 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69   ** the processi
23200 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  ng calls for the
23210 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c   query to abort,
23220 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
23230 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
23240 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46  ents the iAbortF
23250 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lag memory locat
23260 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
23270 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ning in.      **
23280 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c   order to signal
23290 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
232a0 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bort..      */. 
232b0 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72       addrSetAbor
232c0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
232d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
232e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
232f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
23300 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46  eger, 1, iAbortF
23310 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
23320 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74  Comment((v, "set
23330 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
23340 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23350 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
23360 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
23370 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
23380 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
23390 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74  el(v, addrOutput
233a0 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72  Row);.      addr
233b0 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
233c0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
233d0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
233e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
233f0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65  , OP_IfPos, iUse
23400 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74  Flag, addrOutput
23410 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64  Row+2);.      Vd
23420 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
23430 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
23440 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f  nerator entry po
23450 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71  int"));.      sq
23460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
23470 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
23480 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
23490 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
234a0 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
234b0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
234c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
234d0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
234e0 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
234f0 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55  Row+1, SQLITE_JU
23500 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
23510 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
23520 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
23530 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
23540 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
23560 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23580 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
23590 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
235a0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
235b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
235c0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
235d0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
235e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
235f0 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
23600 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
23610 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
23620 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
23630 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
23640 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
23650 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
23660 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
23670 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
23680 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  (v, addrReset);.
23690 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
236a0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
236b0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
236c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
236d0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
236e0 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
236f0 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
23700 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69   pGroupBy.  Begi
23710 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
23720 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55  ies without GROU
23730 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73  P BY: */.    els
23740 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  e {.      ExprLi
23750 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69  st *pDel = 0;.#i
23760 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23770 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20  T_BTREECOUNT.   
23780 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
23790 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20        if( (pTab 
237a0 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  = isSimpleCount(
237b0 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d  p, &sAggInfo))!=
237c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
237d0 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  If isSimpleCount
237e0 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  () returns a poi
237f0 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20  nter to a Table 
23800 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a  structure, then.
23810 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
23820 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
23830 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20  of the form:.   
23840 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
23850 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
23860 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
23870 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
23880 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20     ** where the 
23890 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
238a0 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65  returned represe
238b0 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e  nts table <tbl>.
238c0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
238d0 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74      ** This stat
238e0 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d  ement is so comm
238f0 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70  on that it is op
23900 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c  timized speciall
23910 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  y. The.        *
23920 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72  * OP_Count instr
23930 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74  uction is execut
23940 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65  ed either on the
23950 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68   intkey table th
23960 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
23970 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20  ntains the data 
23980 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20  for table <tbl> 
23990 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73  or on one of its
239a0 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20   indexes. It.   
239b0 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65       ** is bette
239c0 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  r to execute the
239d0 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c   op on an index,
239e0 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20   as indexes are 
239f0 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a  almost.        *
23a00 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20  * always spread 
23a10 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65  across less page
23a20 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72  s than their cor
23a30 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
23a40 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
23a50 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
23a60 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
23a70 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
23a80 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
23a90 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63  hema);.        c
23aa0 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20  onst int iCsr = 
23ab0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
23ac0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
23ad0 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a   scan b-tree */.
23ae0 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
23af0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b10 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
23b20 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79  e */.        Key
23b30 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
23b40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
23b50 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72    /* Keyinfo for
23b60 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a   scanned index *
23b70 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
23b80 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pBest = 0;     
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ba0 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75  * Best index fou
23bb0 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  nd so far */.   
23bc0 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d       int iRoot =
23bd0 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20   pTab->tnum;    
23be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
23bf0 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65  t page of scanne
23c00 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20  d b-tree */..   
23c10 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
23c20 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
23c30 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
23c40 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
23c50 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
23c60 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
23c70 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
23c80 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
23c90 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74   for the index t
23ca0 68 61 74 20 68 61 73 20 74 68 65 20 6c 65 61 73  hat has the leas
23cb0 74 20 61 6d 6f 75 6e 74 20 6f 66 20 63 6f 6c 75  t amount of colu
23cc0 6d 6e 73 2e 20 49 66 0a 20 20 20 20 20 20 20 20  mns. If.        
23cd0 2a 2a 20 74 68 65 72 65 20 69 73 20 73 75 63 68  ** there is such
23ce0 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 69   an index, and i
23cf0 74 20 68 61 73 20 6c 65 73 73 20 63 6f 6c 75 6d  t has less colum
23d00 6e 73 20 74 68 61 6e 20 74 68 65 20 74 61 62 6c  ns than the tabl
23d10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  e.        ** doe
23d20 73 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 61  s, then we can a
23d30 73 73 75 6d 65 20 74 68 61 74 20 69 74 20 63 6f  ssume that it co
23d40 6e 73 75 6d 65 73 20 6c 65 73 73 20 73 70 61 63  nsumes less spac
23d50 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 0a 20 20  e on disk and.  
23d60 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 74 68        ** will th
23d70 65 72 65 66 6f 72 65 20 62 65 20 63 68 65 61 70  erefore be cheap
23d80 65 72 20 74 6f 20 73 63 61 6e 20 74 6f 20 64 65  er to scan to de
23d90 74 65 72 6d 69 6e 65 20 74 68 65 20 71 75 65 72  termine the quer
23da0 79 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20  y result..      
23db0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
23dc0 65 20 73 65 74 20 69 52 6f 6f 74 20 74 6f 20 74  e set iRoot to t
23dd0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
23de0 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
23df0 20 62 2d 74 72 65 65 0a 20 20 20 20 20 20 20 20   b-tree.        
23e00 2a 2a 20 61 6e 64 20 70 4b 65 79 49 6e 66 6f 20  ** and pKeyInfo 
23e10 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  to the KeyInfo s
23e20 74 72 75 63 74 75 72 65 20 72 65 71 75 69 72 65  tructure require
23e30 64 20 74 6f 20 6e 61 76 69 67 61 74 65 20 74 68  d to navigate th
23e40 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  e.        ** ind
23e50 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
23e60 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61         ** In pra
23e70 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66  ctice the KeyInf
23e80 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c  o structure will
23e90 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74   not be used. It
23ea0 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20   is only .      
23eb0 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b    ** passed to k
23ec0 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  eep OP_OpenRead 
23ed0 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a  happy..        *
23ee0 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  /.        for(pI
23ef0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
23f00 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
23f10 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
23f20 20 20 20 20 69 66 28 20 21 70 42 65 73 74 20 7c      if( !pBest |
23f30 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c  | pIdx->nColumn<
23f40 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  pBest->nColumn )
23f50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  {.            pB
23f60 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  est = pIdx;.    
23f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23f80 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  }.        if( pB
23f90 65 73 74 20 26 26 20 70 42 65 73 74 2d 3e 6e 43  est && pBest->nC
23fa0 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c  olumn<pTab->nCol
23fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52   ){.          iR
23fc0 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75  oot = pBest->tnu
23fd0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  m;.          pKe
23fe0 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49  yInfo = sqlite3I
23ff0 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
24000 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  se, pBest);.    
24010 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
24020 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
24030 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75  ly cursor, execu
24040 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c  te the OP_Count,
24050 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f   close the curso
24060 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  r. */.        sq
24070 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
24080 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
24090 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62  iCsr, iRoot, iDb
240a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
240b0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
240c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
240d0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
240e0 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f  (char *)pKeyInfo
240f0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
24100 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20 7d  DOFF);.        }
24110 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24120 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24130 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41  _Count, iCsr, sA
24140 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e  ggInfo.aFunc[0].
24150 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
24160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
24170 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43  (v, OP_Close, iC
24180 73 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sr);.      }else
24190 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
241a0 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
241b0 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  T */.      {.   
241c0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
241d0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66   the query is of
241e0 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
241f0 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20  owing forms:.   
24200 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
24210 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  **   SELECT min(
24220 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
24230 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
24240 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  max(x) FROM ....
24250 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
24260 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20     ** If it is, 
24270 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64  then ask the cod
24280 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20  e in where.c to 
24290 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20  attempt to sort 
242a0 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20  results.        
242b0 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77  ** as if there w
242c0 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20  as an "ORDER ON 
242d0 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20  x" or "ORDER ON 
242e0 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20  x DESC" clause. 
242f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77  .        ** If w
24300 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74  here.c is able t
24310 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74  o produce result
24320 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73  s sorted in this
24330 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20   order, then.   
24340 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65       ** add vdbe
24350 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f   code to break o
24360 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73  ut of the proces
24370 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20  sing loop after 
24380 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
24390 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
243a0 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74  (since the first
243b0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
243c0 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20  e loop is .     
243d0 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
243e0 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
243f0 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20  he row with the 
24400 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d  minimum or maxim
24410 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  um .        ** v
24420 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f  alue of x, the o
24430 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64  nly row required
24440 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  )..        **.  
24450 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69        ** A speci
24460 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20  al flag must be 
24470 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
24480 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f  3WhereBegin() to
24490 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
244a0 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61    ** modify beha
244b0 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73  viour as follows
244c0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
244d0 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74       **   + If t
244e0 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53  he query is a "S
244f0 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74  ELECT min(x)", t
24500 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64  hen the loop cod
24510 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  ed by.        **
24520 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f       where.c sho
24530 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20  uld not iterate 
24540 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20  over any values 
24550 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75  with a NULL valu
24560 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  e.        **    
24570 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20   for x..        
24580 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
24590 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  + The optimizer 
245a0 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
245b0 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20  (the thing that 
245c0 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20  decides which.  
245d0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64        **     ind
245e0 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f  ex or indices to
245f0 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61   use) should pla
24600 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  ce a different p
24610 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20  riority on .    
24620 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73      **     satis
24630 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52  fying the 'ORDER
24640 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e   BY' clause than
24650 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65   it does in othe
24660 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20  r cases..       
24670 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f   **     Refer to
24680 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e   code and commen
24690 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f  ts in where.c fo
246a0 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20  r details..     
246b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78     */.        Ex
246c0 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20  prList *pMinMax 
246d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
246e0 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  flag = minMaxQue
246f0 72 79 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  ry(p);.        i
24700 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  f( flag ){.     
24710 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
24720 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d  prHasProperty(p-
24730 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
24740 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
24750 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t) );.          
24760 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
24770 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
24780 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
24790 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c  .pExpr->x.pList,
247a0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  0);.          pD
247b0 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20  el = pMinMax;.  
247c0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e          if( pMin
247d0 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Max && !db->mall
247e0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
247f0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
24800 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
24810 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52  = flag!=WHERE_OR
24820 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a  DERBY_MIN ?1:0;.
24830 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
24840 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
24850 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
24860 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24870 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
24880 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
24890 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
248a0 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
248b0 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
248c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
248d0 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
248e0 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
248f0 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
24900 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20  ngle row.       
24910 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
24920 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
24930 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
24940 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
24950 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  Info);.        p
24960 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
24970 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
24980 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
24990 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c  re, &pMinMax, fl
249a0 61 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ag);.        if(
249b0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20   pWInfo==0 ){.  
249c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
249d0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
249e0 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pDel);.       
249f0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
24a00 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
24a10 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
24a20 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
24a30 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
24a40 20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78      if( !pMinMax
24a50 20 26 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20   && flag ){.    
24a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24a70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
24a80 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69  to, 0, pWInfo->i
24a90 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
24aa0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
24ab0 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
24ac0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
24ad0 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f     (flag==WHERE_
24ae0 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
24af0 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
24b00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
24b10 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
24b20 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66  Info);.        f
24b30 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
24b40 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
24b50 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  gInfo);.      }.
24b60 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
24b70 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
24b80 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
24b90 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
24ba0 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a  ddrEnd, SQLITE_J
24bb0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
24bc0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
24bd0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
24be0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  pEList, 0, 0, 0,
24bf0 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20   -1, .          
24c00 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
24c10 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
24c20 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  End);.      sqli
24c30 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
24c40 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
24c50 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
24c60 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
24c70 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
24c80 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
24c90 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
24ca0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
24cb0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
24cc0 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
24cd0 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
24ce0 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
24cf0 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
24d00 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
24d10 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
24d20 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
24d30 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
24d40 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
24d50 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
24d60 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
24d70 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
24d80 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
24d90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
24da0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
24db0 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
24dc0 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
24dd0 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
24de0 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
24df0 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
24e00 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
24e10 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
24e20 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
24e30 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
24e40 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
24e50 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
24e60 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
24e70 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
24e80 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
24e90 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
24ea0 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd:..  /* Identi
24eb0 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
24ec0 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  if results of th
24ed0 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20  e SELECT are to 
24ee0 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
24ef0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24f00 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44  _OK && pDest->eD
24f10 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
24f20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
24f30 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
24f40 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
24f50 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ist);.  }..  sql
24f60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
24f70 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20  AggInfo.aCol);. 
24f80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24f90 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  b, sAggInfo.aFun
24fa0 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  c);.  return rc;
24fb0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
24fc0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
24fd0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
24fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25020 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
25030 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 20 66  g code is used f
25040 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
25050 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
25060 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74  The code.** that
25070 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f   follows does no
25080 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d  t appear in norm
25090 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a  al builds..**.**
250a0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
250b0 61 72 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e  are used to prin
250c0 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  t out the conten
250d0 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74  t of all or part
250e0 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20   of a .** parse 
250f0 73 74 72 75 63 74 75 72 65 73 20 73 75 63 68 20  structures such 
25100 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70  as Select or Exp
25110 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75  r.  Such printou
25120 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a  ts are useful.**
25130 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20   for helping to 
25140 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74 20  understand what 
25150 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73  is happening ins
25160 69 64 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e  ide the code gen
25170 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67  erator.** during
25180 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f   the execution o
25190 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54  f complex SELECT
251a0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
251b0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
251c0 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20   are not called 
251d0 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69  anywhere from wi
251e0 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a  thin the normal.
251f0 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54  ** code base.  T
25200 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64  hen are intended
25210 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72   to be called fr
25220 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64 65  om within the de
25230 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f  bugger.** or fro
25240 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69  m temporary "pri
25250 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20  ntf" statements 
25260 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65 62  inserted for deb
25270 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ugging..*/.void 
25280 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
25290 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
252a0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
252b0 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
252c0 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
252d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
252e0 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 73 22  ebugPrintf("(%s"
252f0 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
25300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
25310 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25320 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20  "(%d", p->op);. 
25330 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66   }.  if( p->pLef
25340 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
25350 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29  DebugPrintf(" ")
25360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
25370 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29  ntExpr(p->pLeft)
25380 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
25390 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  Right ){.    sql
253a0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
253b0 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  " ");.    sqlite
253c0 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52  3PrintExpr(p->pR
253d0 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ight);.  }.  sql
253e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
253f0 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ")");.}.void sql
25400 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
25410 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
25420 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  t){.  int i;.  f
25430 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
25440 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
25450 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
25460 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
25470 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69  Expr);.    if( i
25480 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
25490 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
254a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22  DebugPrintf(", "
254b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76  );.    }.  }.}.v
254c0 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
254d0 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
254e0 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20  , int indent){. 
254f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25500 6e 74 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25  ntf("%*sSELECT(%
25510 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  p) ", indent, ""
25520 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  , p);.  sqlite3P
25530 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
25540 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
25550 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
25560 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  n");.  if( p->pS
25570 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  rc ){.    char *
25580 7a 50 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74  zPrefix;.    int
25590 20 69 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20   i;.    zPrefix 
255a0 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f  = "FROM";.    fo
255b0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63  r(i=0; i<p->pSrc
255c0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
255d0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
255e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
255f0 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b   &p->pSrc->a[i];
25600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
25610 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22  bugPrintf("%*s "
25620 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65  , indent+6, zPre
25630 66 69 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65  fix);.      zPre
25640 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  fix = "";.      
25650 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
25660 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
25670 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25680 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ("(\n");.       
25690 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
256a0 65 63 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65  ect(pItem->pSele
256b0 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a  ct, indent+10);.
256c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
256d0 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29  ebugPrintf("%*s)
256e0 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29  ", indent+8, "")
256f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
25700 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  ( pItem->zName )
25710 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25720 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 73  3DebugPrintf("%s
25730 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
25740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25750 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20  if( pItem->pTab 
25760 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25770 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
25780 74 61 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74  table: %s)", pIt
25790 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
257a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
257b0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
257c0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
257d0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
257e0 22 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d  " AS %s", pItem-
257f0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
25800 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d  }.      if( i<p-
25810 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b  >pSrc->nSrc-1 ){
25820 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25830 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29  DebugPrintf(",")
25840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25850 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25860 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  tf("\n");.    }.
25870 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68    }.  if( p->pWh
25880 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
25890 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
258a0 2a 73 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65  *s WHERE ", inde
258b0 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
258c0 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
258d0 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
258e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
258f0 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
25900 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  ( p->pGroupBy ){
25910 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
25920 67 50 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f  gPrintf("%*s GRO
25930 55 50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c  UP BY ", indent,
25940 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
25950 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70  3PrintExprList(p
25960 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
25970 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25980 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
25990 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
259a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
259b0 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48  bugPrintf("%*s H
259c0 41 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c  AVING ", indent,
259d0 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
259e0 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48  3PrintExpr(p->pH
259f0 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
25a00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25a10 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
25a20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
25a30 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25a40 72 69 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52  rintf("%*s ORDER
25a50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22   BY ", indent, "
25a60 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
25a70 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
25a80 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
25a90 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25aa0 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f  f("\n");.  }.}./
25ab0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72  * End of the str
25ac0 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69  ucture debug pri
25ad0 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a  nting code.*****
25ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25b20 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
25b30 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
25b40 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
25b50 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
25b60 29 20 2a 2f 0a                                   ) */.