/ Hex Artifact Content
Login

Artifact a727f61f3267bfa20ce1c3e85d38dc2132db1060:


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 54 68   -1;.}../*.** Th
1660: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1670: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
1680: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
1690: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
16a0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
16b0: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
16c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
16d0: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
16e0: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
16f0: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
1700: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
1710: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1720: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
1730: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
1740: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
1750: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
1760: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
1770: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
1780: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
1790: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
17a0: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
17b0: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
17c0: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
17d0: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
17e0: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
17f0: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1800: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
1810: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1820: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1830: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1840: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1870: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
1880: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 72 63 2c  e */.  int iSrc,
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18b0: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
18c0: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
18d0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
18e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18f0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1900: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
1910: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1920: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
1930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1940: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
1950: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
1960: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
1970: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
1980: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1990: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
19a0: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
19b0: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
19c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
19d0: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
19e0: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
19f0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
1a00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1a10: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
1a20: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
1a30: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
1a40: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 28 69  t( pSrc->nSrc>(i
1a50: 53 72 63 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  Src+1) );.  asse
1a60: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 53 72 63  rt( pSrc->a[iSrc
1a70: 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65  ].pTab );.  asse
1a80: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 53 72 63  rt( pSrc->a[iSrc
1a90: 2b 31 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70  +1].pTab );..  p
1aa0: 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  E1 = sqlite3Crea
1ab0: 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c  teColumnExpr(db,
1ac0: 20 70 53 72 63 2c 20 69 53 72 63 2c 20 69 43 6f   pSrc, iSrc, iCo
1ad0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
1ae0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
1af0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
1b00: 2c 20 69 53 72 63 2b 31 2c 20 69 43 6f 6c 52 69  , iSrc+1, iColRi
1b10: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
1b20: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1b30: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
1b40: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
1b50: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
1b60: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
1b70: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
1b80: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
1b90: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ba0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 71 2c  AnyProperty(pEq,
1bb0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
1bc0: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
1bd0: 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69   ExprSetIrreduci
1be0: 62 6c 65 28 70 45 71 29 3b 0a 20 20 20 20 70 45  ble(pEq);.    pE
1bf0: 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  q->iRightJoinTab
1c00: 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69  le = (i16)pE2->i
1c10: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70  Table;.  }.  *pp
1c20: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1c30: 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68  xprAnd(db, *ppWh
1c40: 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a  ere, pEq);.}../*
1c50: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
1c60: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
1c70: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
1c80: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
1c90: 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65  ssion..** And se
1ca0: 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68  t the Expr.iRigh
1cb0: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54  tJoinTable to iT
1cc0: 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74  able for every t
1cd0: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  erm in the.** ex
1ce0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
1cf0: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
1d00: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
1d10: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
1d20: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
1d30: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
1d40: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
1d50: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
1d60: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
1d70: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
1d80: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
1d90: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
1da0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1db0: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
1dc0: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
1dd0: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
1de0: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
1df0: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
1e00: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
1e10: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
1e20: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
1e30: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
1e40: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
1e50: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
1e60: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
1e70: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
1e80: 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  The Expr.iRightJ
1e90: 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74  oinTable tells t
1ea0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1eb0: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
1ec0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
1ed0: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62  n depends on tab
1ee0: 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  le iRightJoinTab
1ef0: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  le even if that 
1f00: 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  table is not.** 
1f10: 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69  explicitly menti
1f20: 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72  oned in the expr
1f30: 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e  ession.  That in
1f40: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65  formation is nee
1f50: 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73  ded.** for cases
1f60: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1f70: 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
1f80: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
1f90: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20  t2 ON t1.a=t2.b 
1fa0: 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a  AND t1.x=5.**.**
1fb0: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
1fc0: 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72  e needs to defer
1fd0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
1fe0: 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74   the t1.x=5.** t
1ff0: 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20  erm until after 
2000: 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74  the t2 loop of t
2010: 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61  he join.  In tha
2020: 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c  t way, a.** NULL
2030: 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   t2 row will be 
2040: 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65  inserted wheneve
2050: 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77  r t1.x!=5.  If w
2060: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65  e do not.** defe
2070: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2080: 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c  f t1.x=5, it wil
2090: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  l be processed i
20a0: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66  mmediately.** af
20b0: 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ter the t1 loop 
20c0: 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31  and rows with t1
20d0: 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72  .x!=5 will never
20e0: 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68   appear in.** th
20f0: 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20  e output, which 
2100: 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f  is incorrect..*/
2110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
2120: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
2130: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
2140: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2150: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2160: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
2170: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2180: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
2190: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
21a0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
21b0: 0a 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65  .    ExprSetIrre
21c0: 64 75 63 69 62 6c 65 28 70 29 3b 0a 20 20 20 20  ducible(p);.    
21d0: 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  p->iRightJoinTab
21e0: 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65  le = (i16)iTable
21f0: 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70  ;.    setJoinExp
2200: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  r(p->pLeft, iTab
2210: 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  le);.    p = p->
2220: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
2230: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2240: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
2250: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
2260: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
2270: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
2280: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
2290: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
22a0: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
22b0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
22c0: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
22d0: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
22e0: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
22f0: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
2300: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
2310: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
2320: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
2330: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
2340: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
2350: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
2360: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
2370: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
2380: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
2390: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
23a0: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
23b0: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
23c0: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
23d0: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
23e0: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
23f0: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
2400: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
2410: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
2420: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
2430: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
2440: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2450: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2460: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
2470: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
2480: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
2490: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
24a0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
24b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
24c0: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
24d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
24e0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
24f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2500: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
2510: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2530: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
2540: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
2550: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2580: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
2590: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25a0: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
25b0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
25c0: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
25d0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25e0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
25f0: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
2600: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
2610: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
2620: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
2630: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
2640: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
2650: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
2660: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
2670: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
2680: 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62   Table *pLeftTab
2690: 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a   = pLeft->pTab;.
26a0: 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68      Table *pRigh
26b0: 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70  tTab = pRight->p
26c0: 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f  Tab;.    int isO
26d0: 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e  uter;..    if( N
26e0: 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30  EVER(pLeftTab==0
26f0: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
2700: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2710: 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69    isOuter = (pRi
2720: 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  ght->jointype & 
2730: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20  JT_OUTER)!=0;.. 
2740: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
2750: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
2760: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
2770: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2780: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
2790: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
27a0: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
27b0: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
27c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
27d0: 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  ght->jointype & 
27e0: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20  JT_NATURAL ){.  
27f0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2800: 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70  pOn || pRight->p
2810: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  Using ){.       
2820: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2830: 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55  (pParse, "a NATU
2840: 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74  RAL join may not
2850: 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20   have ".        
2860: 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49     "an ON or USI
2870: 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a  NG clause", 0);.
2880: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2890: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74  for(j=0; j<pLeft
28b0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
28c0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
28d0: 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d  Name = pLeftTab-
28e0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
28f0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
2900: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
2910: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
2920: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
2930: 66 28 20 69 52 69 67 68 74 43 6f 6c 3e 3d 30 20  f( iRightCol>=0 
2940: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
2950: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
2960: 2c 20 70 53 72 63 2c 20 69 2c 20 6a 2c 20 69 52  , pSrc, i, j, iR
2970: 69 67 68 74 43 6f 6c 2c 20 69 73 4f 75 74 65 72  ightCol, isOuter
2980: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
2990: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
29b0: 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20  isallow both ON 
29c0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
29d0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
29e0: 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  in.    */.    if
29f0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26  ( pRight->pOn &&
2a00: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2a10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2a30: 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f   "cannot have bo
2a40: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
2a50: 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73  ".        "claus
2a60: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2a70: 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  oin");.      ret
2a80: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 1;.    }..  
2a90: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20    /* Add the ON 
2aa0: 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e  clause to the en
2ab0: 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
2ac0: 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64  lause, connected
2ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e   by.    ** an AN
2ae0: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  D operator..    
2af0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2b00: 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20  t->pOn ){.      
2b10: 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65  if( isOuter ) se
2b20: 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74  tJoinExpr(pRight
2b30: 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69  ->pOn, pRight->i
2b40: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70  Cursor);.      p
2b50: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
2b60: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
2b70: 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  ->db, p->pWhere,
2b80: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20   pRight->pOn);. 
2b90: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e       pRight->pOn
2ba0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
2bb0: 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61   /* Create extra
2bc0: 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48   terms on the WH
2bd0: 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65  ERE clause for e
2be0: 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  ach column named
2bf0: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55  .    ** in the U
2c00: 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78  SING clause.  Ex
2c10: 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77  ample: If the tw
2c20: 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  o tables to be j
2c30: 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a  oined are .    *
2c40: 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68  * A and B and th
2c50: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e  e USING clause n
2c60: 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a  ames X, Y, and Z
2c70: 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a  , then add this.
2c80: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48      ** to the WH
2c90: 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41  ERE clause:    A
2ca0: 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42  .X=B.X AND A.Y=B
2cb0: 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20  .Y AND A.Z=B.Z. 
2cc0: 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20     ** Report an 
2cd0: 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c  error if any col
2ce0: 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  umn mentioned in
2cf0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
2d00: 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  e is.    ** not 
2d10: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74  contained in bot
2d20: 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  h tables to be j
2d30: 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  oined..    */.  
2d40: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55    if( pRight->pU
2d50: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64  sing ){.      Id
2d60: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52  List *pList = pR
2d70: 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20  ight->pUsing;.  
2d80: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2d90: 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b  List->nId; j++){
2da0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2db0: 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Name = pList->a[
2dc0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2dd0: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 20 3d    int iLeftCol =
2de0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
2df0: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ftTab, zName);. 
2e00: 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67 68         int iRigh
2e10: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
2e20: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
2e30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
2e40: 28 20 69 4c 65 66 74 43 6f 6c 3c 30 20 7c 7c 20  ( iLeftCol<0 || 
2e50: 69 52 69 67 68 74 43 6f 6c 3c 30 20 29 7b 0a 20  iRightCol<0 ){. 
2e60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e70: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2e80: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
2e90: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
2ea0: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
2eb0: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
2ec0: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
2ed0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
2ee0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2ef0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f00: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
2f10: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 2c 20 69  arse, pSrc, i, i
2f20: 4c 65 66 74 43 6f 6c 2c 20 69 52 69 67 68 74 43  LeftCol, iRightC
2f30: 6f 6c 2c 20 69 73 4f 75 74 65 72 2c 20 26 70 2d  ol, isOuter, &p-
2f40: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
2f50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2f60: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2f70: 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74   Insert code int
2f80: 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20  o "v" that will 
2f90: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
2fa0: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
2fb0: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20  e.** stack into 
2fc0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73  the sorter..*/.s
2fd0: 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f  tatic void pushO
2fe0: 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72  ntoSorter(.  Par
2ff0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3000: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
3010: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
3020: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
3030: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
3040: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65  Y clause */.  Se
3050: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
3060: 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
3070: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3080: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  nt */.  int regD
3090: 61 74 61 20 20 20 20 20 20 20 20 20 20 20 20 2f  ata            /
30a0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
30b0: 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f  ng data to be so
30c0: 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  rted */.){.  Vdb
30d0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
30e0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70  Vdbe;.  int nExp
30f0: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  r = pOrderBy->nE
3100: 78 70 72 3b 0a 20 20 69 6e 74 20 72 65 67 42 61  xpr;.  int regBa
3110: 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
3120: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
3130: 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74   nExpr+2);.  int
3140: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
3150: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
3160: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
3170: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
3180: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
3190: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
31a0: 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
31b0: 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29  rBy, regBase, 0)
31c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
31d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
31e0: 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ence, pOrderBy->
31f0: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
3200: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  e+nExpr);.  sqli
3210: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
3220: 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
3230: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 31   regBase+nExpr+1
3240: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
3250: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3260: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
3270: 61 73 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20  ase, nExpr + 2, 
3280: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
3290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
32a0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
32b0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
32c0: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  sor, regRecord);
32d0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
32e0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
32f0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
3300: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
3310: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
3320: 65 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29  egBase, nExpr+2)
3330: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  ;.  if( pSelect-
3340: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69  >iLimit ){.    i
3350: 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
3360: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
3370: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
3380: 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->iOffset ){.   
3390: 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c     iLimit = pSel
33a0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a  ect->iOffset+1;.
33b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33c0: 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63   iLimit = pSelec
33d0: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d  t->iLimit;.    }
33e0: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
33f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3400: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69  , OP_IfZero, iLi
3410: 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
3420: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3430: 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74  P_AddImm, iLimit
3440: 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32  , -1);.    addr2
3450: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3460: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
3470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3480: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3490: 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
34a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34b0: 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d  _Last, pOrderBy-
34c0: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
34d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34e0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
34f0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
3500: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
3510: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3520: 61 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65 6c  addr2);.    pSel
3530: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  ect->iLimit = 0;
3540: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3550: 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  d code to implem
3560: 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a  ent the OFFSET.*
3570: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
3580: 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65  deOffset(.  Vdbe
3590: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *v,          /*
35a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
35b0: 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20  nto this VM */. 
35c0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
35d0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
35e0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
35f0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
3600: 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a  iContinue     /*
3610: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
3620: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
3630: 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ecord */.){.  if
3640: 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 26 26 20  ( p->iOffset && 
3650: 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a  iContinue!=0 ){.
3660: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
3670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3680: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
3690: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31  , p->iOffset, -1
36a0: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
36b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
36c0: 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e  v, OP_IfNeg, p->
36d0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71  iOffset);.    sq
36e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
36f0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
3700: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
3710: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
3720: 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f  skip OFFSET reco
3730: 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  rds"));.    sqli
3740: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3750: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
3760: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
3770: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
3780: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
3790: 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   N registers sta
37a0: 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a  rting at iMem.**
37b0: 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74   form a distinct
37c0: 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73   entry.  iTab is
37d0: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
37e0: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
37f0: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
3800: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
3810: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
3820: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
3830: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
3840: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
3850: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
3860: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
3870: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
3880: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
3890: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
38a0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
38b0: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
38c0: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
38d0: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
38e0: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
38f0: 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  inct(.  Parse *p
3900: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
3910: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
3920: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
3930: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  t */.  int iTab,
3940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
3950: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
3960: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
3970: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
3980: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
3990: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
39a0: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
39b0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
39c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
39d0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
39e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3a00: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
3a10: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
3a20: 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72   r1;..  v = pPar
3a30: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20  se->pVdbe;.  r1 
3a40: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
3a50: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
3a60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
3a70: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
3a80: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
3a90: 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73  t, iMem, N);.  s
3aa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3ab0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3ac0: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
3ad0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3ae0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
3af0: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b  sert, iTab, r1);
3b00: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
3b10: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
3b20: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   r1);.}../*.** G
3b30: 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72  enerate an error
3b40: 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61 20   message when a 
3b50: 53 45 4c 45 43 54 20 69 73 20 75 73 65 64 20 77  SELECT is used w
3b60: 69 74 68 69 6e 20 61 20 73 75 62 65 78 70 72 65  ithin a subexpre
3b70: 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c  ssion.** (exampl
3b80: 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43  e:  "a IN (SELEC
3b90: 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22  T * FROM table)"
3ba0: 29 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72  ) but it has mor
3bb0: 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a  e than 1 result.
3bc0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64  ** column.  We d
3bd0: 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72  o this in a subr
3be0: 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65 20 74  outine because t
3bf0: 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
3c00: 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70  in multiple.** p
3c10: 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  laces..*/.static
3c20: 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c   int checkForMul
3c30: 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
3c40: 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ror(.  Parse *pP
3c50: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
3c60: 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f  arse context. */
3c70: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
3c80: 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69  Dest,   /* Desti
3c90: 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54  nation of SELECT
3ca0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
3cb0: 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20 20  t nExpr         
3cc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3cd0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72  result columns r
3ce0: 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
3cf0: 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44  T */.){.  int eD
3d00: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
3d10: 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e  st;.  if( nExpr>
3d20: 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54  1 && (eDest==SRT
3d30: 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
3d40: 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73  RT_Set) ){.    s
3d50: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3d60: 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73  Parse, "only a s
3d70: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c  ingle result all
3d80: 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20  owed for ".     
3d90: 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74    "a SELECT that
3da0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
3db0: 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
3dc0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
3dd0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
3de0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3df0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
3e00: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
3e10: 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66  or the inside of
3e20: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
3e30: 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a  ** of a SELECT..
3e40: 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20  **.** If srcTab 
3e50: 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20  and nColumn are 
3e60: 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20  both zero, then 
3e70: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
3e80: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
3e90: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
3ea0: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
3eb0: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
3ec0: 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20  If nColumn>0.** 
3ed0: 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c  then data is pul
3ee0: 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20  led from srcTab 
3ef0: 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73  and pEList is us
3f00: 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74  ed only to get t
3f10: 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20  he.** datatypes 
3f20: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e  for each column.
3f30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3f40: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
3f50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3f60: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
3f70: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
3f80: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3fa0: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   The complete se
3fb0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62  lect statement b
3fc0: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
3fd0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
3fe0: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
3ff0: 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20  of values being 
4000: 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69  extracted */.  i
4010: 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20  nt srcTab,      
4020: 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64         /* Pull d
4030: 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ata from this ta
4040: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ble */.  int nCo
4050: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
4060: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
4070: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75  lumns in the sou
4080: 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  rce table */.  E
4090: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
40a0: 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74  y,     /* If not
40b0: 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75   NULL, sort resu
40c0: 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b  lts using this k
40d0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  ey */.  int dist
40e0: 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  inct,           
40f0: 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20  /* If >=0, make 
4100: 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65  sure results are
4110: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53   distinct */.  S
4120: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
4130: 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f  ,      /* How to
4140: 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
4150: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
4160: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20   iContinue,     
4170: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
4180: 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
4190: 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20  th next row */. 
41a0: 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
41b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
41c0: 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
41d0: 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ut of the inner 
41e0: 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  loop */.){.  Vdb
41f0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4200: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
4210: 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74   int hasDistinct
4220: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
4230: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
4240: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
4250: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ent */.  int reg
4260: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
4270: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
4280: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
4290: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
42a0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
42b0: 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48  t->eDest;   /* H
42c0: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
42d0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
42e0: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
42f0: 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72  >iParm;   /* Fir
4300: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64  st argument to d
4310: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
4320: 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43  /.  int nResultC
4330: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
4340: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
4350: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a  ult columns */..
4360: 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20    assert( v );. 
4370: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
4380: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
4390: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
43a0: 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20  ;.  hasDistinct 
43b0: 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20  = distinct>=0;. 
43c0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
43d0: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
43e0: 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   ){.    codeOffs
43f0: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4400: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
4410: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
4420: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
4430: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
4440: 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  ){.    nResultCo
4450: 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  l = nColumn;.  }
4460: 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c  else{.    nResul
4470: 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  tCol = pEList->n
4480: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Expr;.  }.  if( 
4490: 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29  pDest->iMem==0 )
44a0: 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65  {.    pDest->iMe
44b0: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
44c0: 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e  +1;.    pDest->n
44d0: 4d 65 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  Mem = nResultCol
44e0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
44f0: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
4500: 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
4510: 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 6e  assert( pDest->n
4520: 4d 65 6d 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20  Mem==nResultCol 
4530: 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73 75  );.  }.  regResu
4540: 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d  lt = pDest->iMem
4550: 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e  ;.  if( nColumn>
4560: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
4570: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
4580: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4590: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
45a0: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
45b0: 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29   i, regResult+i)
45c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
45d0: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  if( eDest!=SRT_E
45e0: 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20  xists ){.    /* 
45f0: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
4600: 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28  on is an EXISTS(
4610: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c  ...) expression,
4620: 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20   the actual.    
4630: 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  ** values return
4640: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
4650: 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65   are not require
4660: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
4670: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
4680: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
4690: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
46a0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
46b0: 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75   pEList, regResu
46c0: 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  lt, eDest==SRT_O
46d0: 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43  utput);.  }.  nC
46e0: 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43  olumn = nResultC
46f0: 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ol;..  /* If the
4700: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
4710: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
4720: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
4730: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
4740: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
4750: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
4760: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
4770: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
4780: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
4790: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
47a0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61  istinct ){.    a
47b0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
47c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
47d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e  pEList->nExpr==n
47e0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f  Column );.    co
47f0: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
4800: 65 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f  e, distinct, iCo
4810: 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c  ntinue, nColumn,
4820: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
4830: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4840: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
4850: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
4860: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
4870: 0a 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72  ..  if( checkFor
4880: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
4890: 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
48a0: 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Dest, pEList->nE
48b0: 78 70 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  xpr) ){.    retu
48c0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rn;.  }..  switc
48d0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
48e0: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
48f0: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
4900: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
4910: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
4920: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
4930: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
4940: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4950: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
4960: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
4970: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
4980: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31  int r1;.      r1
4990: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
49a0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
49b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
49c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
49d0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
49e0: 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  t, nColumn, r1);
49f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4a00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4a10: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
4a20: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
4a30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4a40: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
4a50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4a60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
4a70: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
4a80: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
4a90: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
4aa0: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
4ab0: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
4ac0: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
4ad0: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
4ae0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
4af0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
4b00: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
4b10: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
4b20: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
4b30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4b40: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
4b50: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
4b60: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
4b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4b80: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  ndif..    /* Sto
4b90: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
4ba0: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
4bb0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
4bc0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
4bd0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
4be0: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
4bf0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
4c00: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
4c10: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65  Parse);.      te
4c20: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
4c30: 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
4c40: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
4c50: 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
4c60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4c70: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4c80: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
4c90: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
4ca0: 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   r1);.      if( 
4cb0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
4cc0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4cd0: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
4ce0: 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20  rBy, p, r1);.   
4cf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d00: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
4d10: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
4d20: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
4d30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4d40: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
4d50: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
4d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4d70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
4d80: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
4d90: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
4da0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
4db0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
4dc0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4dd0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
4de0: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
4df0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4e00: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4e10: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
4e20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4e30: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4e40: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
4e50: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
4e60: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
4e70: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
4e80: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
4e90: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
4ea0: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
4eb0: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
4ec0: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
4ed0: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
4ee0: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
4ef0: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
4f00: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
4f10: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4f20: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
4f30: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
4f40: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66   );.      p->aff
4f50: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43  inity = sqlite3C
4f60: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
4f70: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
4f80: 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69  r, pDest->affini
4f90: 74 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ty);.      if( p
4fa0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
4fb0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
4fc0: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
4fd0: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
4fe0: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
4ff0: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
5000: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
5010: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
5020: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
5030: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
5040: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
5050: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
5060: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
5070: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
5080: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
5090: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
50a0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
50b0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
50c0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
50d0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
50e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
50f0: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
5100: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5110: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
5120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5130: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
5140: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
5150: 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69   1, r1, &p->affi
5160: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
5170: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
5180: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
5190: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
51a0: 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  lt, 1);.        
51b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
51c0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
51d0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
51e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
51f0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
5200: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
5210: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5220: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
5230: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
5240: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
5250: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
5260: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
5270: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
5280: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
5290: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
52a0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
52b0: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
52c0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
52d0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
52e0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
52f0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
5300: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5310: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
5320: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
5330: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
5340: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
5350: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
5360: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
5370: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
5380: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
5390: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
53a0: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
53b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
53c0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
53d0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
53e0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn==1 );.      i
53f0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
5400: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
5410: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
5420: 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65  rderBy, p, regRe
5430: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  sult);.      }el
5440: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5450: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
5460: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
5470: 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t, iParm, 1);.  
5480: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
5490: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
54a0: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
54b0: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
54c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
54d0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
54e0: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
54f0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
5500: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20  */..    /* Send 
5510: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
5520: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
5530: 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75  n or to a subrou
5540: 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20  tine.  In the.  
5550: 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73    ** case of a s
5560: 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73  ubroutine, the s
5570: 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66  ubroutine itself
5580: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5590: 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69  for.    ** poppi
55a0: 6e 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d  ng the data from
55b0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
55c0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
55d0: 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63  Coroutine:.    c
55e0: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
55f0: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
5600: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
5610: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
5620: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
5630: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
5640: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5650: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
5660: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5670: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5680: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5690: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
56a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
56b0: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
56c0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75   r1);.        pu
56d0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
56e0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
56f0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
5700: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5710: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5720: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5730: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
5740: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
5750: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5760: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
5770: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
5780: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5790: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
57a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
57b0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
57c0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
57d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
57e0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
57f0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
5800: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
5810: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5820: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
5830: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5840: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
5850: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
5860: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
5870: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
5880: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
5890: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
58a0: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
58b0: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
58c0: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
58d0: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
58e0: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
58f0: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
5900: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
5910: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
5920: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
5930: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
5940: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
5950: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
5960: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
5970: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
5980: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
5990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
59a0: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
59b0: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
59c0: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
59d0: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
59e0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
59f0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
5a00: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
5a10: 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 66 20 74 68  ==0 );  /* If th
5a20: 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
5a30: 42 59 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a  BY, the call to.
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
5a60: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
5a70: 77 6f 75 6c 64 20 68 61 76 65 20 63 6c 65 61 72  would have clear
5a80: 65 64 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  ed p->iLimit */.
5a90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5aa0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp3(v, OP_IfZe
5ab0: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
5ac0: 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a  Break, -1);.  }.
5ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5ae0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
5af0: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65  t, generate a Ke
5b00: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5b10: 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20  that records.** 
5b20: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
5b30: 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20  quence for each 
5b40: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
5b50: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  at expression li
5b60: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
5b70: 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20   ExprList is an 
5b80: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
5b90: 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e  P BY clause then
5ba0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a   the resulting.*
5bb0: 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  * KeyInfo struct
5bc0: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
5bd0: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
5be0: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ing a virtual in
5bf0: 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  dex to.** implem
5c00: 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e  ent that clause.
5c10: 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73    If the ExprLis
5c20: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
5c30: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a  set of a SELECT.
5c40: 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49  ** then the KeyI
5c50: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
5c60: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
5c70: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
5c80: 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78  virtual.** index
5c90: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
5ca0: 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a  DISTINCT test..*
5cb0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
5cc0: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
5cd0: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
5ce0: 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  in from malloc. 
5cf0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
5d00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
5d10: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
5d20: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
5d30: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
5d40: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20  ally.** freed.  
5d50: 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  Add the KeyInfo 
5d60: 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65  structure to the
5d70: 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20   P4 field of an 
5d80: 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20  opcode using.** 
5d90: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
5da0: 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c 20  FF is the usual 
5db0: 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77  way of dealing w
5dc0: 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61  ith this..*/.sta
5dd0: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
5de0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
5df0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5e00: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
5e10: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
5e20: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
5e30: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79  int nExpr;.  Key
5e40: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73  Info *pInfo;.  s
5e50: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
5e60: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
5e70: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
5e80: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
5e90: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  pInfo = sqlite3D
5ea0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
5eb0: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b  sizeof(*pInfo) +
5ec0: 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
5ed0: 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
5ee0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
5ef0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
5f00: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66  der = (u8*)&pInf
5f10: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  o->aColl[nExpr];
5f20: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65  .    pInfo->nFie
5f30: 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b  ld = (u16)nExpr;
5f40: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20  .    pInfo->enc 
5f50: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70  = ENC(db);.    p
5f60: 49 6e 66 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  Info->db = db;. 
5f70: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
5f80: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45  m=pList->a; i<nE
5f90: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
5fa0: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
5fb0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
5fc0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
5fd0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
5fe0: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
5ff0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
6000: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
6010: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
6020: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
6030: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
6040: 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
6050: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
6060: 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  der[i] = pItem->
6070: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
6080: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
6090: 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  nfo;.}.../*.** I
60a0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
60b0: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
60c0: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
60d0: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
60e0: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
60f0: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
6100: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
6110: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
6120: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
6130: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
6140: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
6150: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
6160: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
6170: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
6180: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
6190: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
61a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
61b0: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
61c0: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
61d0: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
61e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
61f0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
6200: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
6210: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
6220: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
6230: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
6240: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
6250: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
6260: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
6270: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
6280: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
6290: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
62a0: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
62b0: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
62c0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  ){.  int addrBre
62d0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
62e0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20  MakeLabel(v);   
62f0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
6300: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
6310: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
6320: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
6330: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
6340: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
6350: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
6360: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
6370: 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64  Tab;.  int pseud
6380: 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  oTab = 0;.  Expr
6390: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
63a0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
63b0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
63c0: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
63d0: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
63e0: 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65  iParm;..  int re
63f0: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
6400: 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20  owid;..  iTab = 
6410: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
6420: 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73  or;.  regRow = s
6430: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6440: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
6450: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
6460: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
6470: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6480: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61   pseudoTab = pPa
6490: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
64a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64b0: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
64c0: 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  udo, pseudoTab, 
64d0: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
64e0: 3b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  ;.    regRowid =
64f0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
6500: 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69   regRowid = sqli
6510: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6520: 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 61 64 64  arse);.  }.  add
6530: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
6540: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6550: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
6560: 42 72 65 61 6b 29 3b 0a 20 20 63 6f 64 65 4f 66  Break);.  codeOf
6570: 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64 72 43  fset(v, p, addrC
6580: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
6590: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
65a0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
65b0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
65c0: 72 20 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a  r + 1, regRow);.
65d0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
65e0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
65f0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
6600: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
6610: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6620: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
6630: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
6640: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
6650: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
6660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6670: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
6680: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
6690: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
66a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
66b0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
66c0: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
66d0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
66e0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
66f0: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
6700: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6710: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
6720: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6730: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
6740: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
6750: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
6760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6770: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
6780: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
6790: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
67a0: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
67b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
67c0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
67d0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
67e0: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
67f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6800: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6810: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
6820: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
6830: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6840: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
6850: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6860: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6870: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
6880: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
6890: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
68a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
68b0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
68c0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
68d0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
68e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
68f0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
6900: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
6910: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
6920: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
6930: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
6940: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
6950: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
6960: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
6970: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6980: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
6990: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
69a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
69b0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
69c0: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f 77    assert( regRow
69d0: 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20  !=pDest->iMem+i 
69e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
69f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6a00: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64  OP_Column, pseud
6a10: 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e  oTab, i, pDest->
6a20: 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20 20  iMem+i);.       
6a30: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
6a40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6a50: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
6a60: 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29  FLAG_CLEARCACHE)
6a70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6a80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44    }.      if( eD
6a90: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6aa0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6ab0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6ac0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
6ad0: 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75  est->iMem, nColu
6ae0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
6af0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
6b00: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
6b10: 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c  se, pDest->iMem,
6b20: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
6b30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6b40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6b50: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6b60: 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20  Dest->iParm);.  
6b70: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6b80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
6b90: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6ba0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
6bb0: 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Row);.  sqlite3R
6bc0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6bd0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
6be0: 0a 0a 20 20 2f 2a 20 4c 49 4d 49 54 20 68 61 73  ..  /* LIMIT has
6bf0: 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65   been implemente
6c00: 64 20 62 79 20 74 68 65 20 70 75 73 68 4f 6e 74  d by the pushOnt
6c10: 6f 53 6f 72 74 65 72 28 29 20 72 6f 75 74 69 6e  oSorter() routin
6c20: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
6c30: 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 29  ( p->iLimit==0 )
6c40: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74  ;..  /* The bott
6c50: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
6c60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
6c70: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
6c80: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
6c90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ca0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
6cb0: 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73  iTab, addr);.  s
6cc0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
6cd0: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
6ce0: 65 61 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73  eak);.  if( eDes
6cf0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
6d00: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
6d10: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c  utine ){.    sql
6d20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6d30: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75  , OP_Close, pseu
6d40: 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d  doTab, 0);.  }.}
6d50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
6d60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
6d70: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
6d80: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
6d90: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
6da0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
6db0: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
6dc0: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
6dd0: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
6de0: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ller..**.** The 
6df0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6e00: 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61   is the exact da
6e10: 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f  tatype definitio
6e20: 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  n extracted from
6e30: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
6e40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6e50: 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65  atement if the e
6e60: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
6e70: 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65  olumn. The.** de
6e80: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
6e90: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
6ea0: 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61   is INTEGER. Exa
6eb0: 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70  ctly when an exp
6ec0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  ression.** is co
6ed0: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
6ee0: 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78  n can be complex
6ef0: 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65   in the presence
6f00: 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20   of subqueries. 
6f10: 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  The.** result-se
6f20: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  t expression in 
6f30: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
6f40: 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74  wing SELECT stat
6f50: 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f  ements is .** co
6f60: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
6f70: 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  n by this functi
6f80: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  on..**.**   SELE
6f90: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
6fa0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
6fb0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
6fc0: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
6fd0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
6fe0: 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  tbl);.**   SELEC
6ff0: 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45  T abc FROM (SELE
7000: 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52  CT col AS abc FR
7010: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20  OM tbl);.** .** 
7020: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
7030: 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70  type for any exp
7040: 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68  ression other th
7050: 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e  an a column is N
7060: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
7070: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
7080: 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e  nType(.  NameCon
7090: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
70a0: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e  pr *pExpr,.  con
70b0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
70c0: 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  inDb,.  const ch
70d0: 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62  ar **pzOriginTab
70e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
70f0: 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a  *pzOriginCol.){.
7100: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
7110: 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
7120: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62  const *zOriginDb
7130: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
7140: 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d  st *zOriginTab =
7150: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
7160: 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30   *zOriginCol = 0
7170: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28  ;.  int j;.  if(
7180: 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
7190: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
71a0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
71b0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
71c0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
71d0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
71e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
71f0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
7200: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
7210: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
7220: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
7230: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
7240: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
7250: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
7260: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
7270: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
7280: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
7290: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
72a0: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
72b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
72c0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
72e0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
72f0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
7300: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
7310: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
7320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7330: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
7340: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
7350: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
7360: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
7370: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
7380: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
7390: 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ab */.      test
73a0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
73b0: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
73c0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
73d0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
73e0: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
73f0: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
7400: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
7410: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
7420: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
7430: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
7440: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
7450: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
7460: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
7470: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
7480: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
7490: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
74a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
74b0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
74c0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
74d0: 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d    pS = pTabList-
74e0: 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[j].pSelect;. 
74f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7500: 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e          pNC = pN
7510: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
7520: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
7530: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
7540: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
7550: 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73  one time, code s
7560: 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e  uch as "SELECT n
7570: 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74  ew.x" within a t
7580: 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20  rigger would.   
7590: 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
75a0: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20  is condition to 
75b0: 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e  run.  Since then
75c0: 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75  , we have restru
75d0: 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20  ctured how.     
75e0: 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f     ** trigger co
75f0: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
7600: 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64  and so this cond
7610: 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67  ition is no long
7620: 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  er .        ** p
7630: 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72  ossible. However
7640: 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62  , it can still b
7650: 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65  e true for state
7660: 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20  ments like.     
7670: 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
7680: 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing:.        **.
7690: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45          **   CRE
76a0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c  ATE TABLE t1(col
76b0: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20   INTEGER);.     
76c0: 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28     **   SELECT (
76d0: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46  SELECT t1.col) F
76e0: 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ROM FROM t1;.   
76f0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
7700: 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  ** when columnTy
7710: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
7720: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
7730: 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65   "t1.col" in the
7740: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62   .        ** sub
7750: 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73  -select. In this
7760: 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63   case, set the c
7770: 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55  olumn type to NU
7780: 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20  LL, even.       
7790: 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68   ** though it sh
77a0: 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22  ould really be "
77b0: 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20  INTEGER"..      
77c0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
77d0: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72  This is not a pr
77e0: 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f  oblem, as the co
77f0: 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31  lumn type of "t1
7800: 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20  .col" is never. 
7810: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20         ** used. 
7820: 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  When columnType(
7830: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
7840: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20  he expression . 
7850: 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45         ** "(SELE
7860: 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65  CT t1.col)", the
7870: 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73   correct type is
7880: 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74   returned (see t
7890: 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20  he TK_SELECT.   
78a0: 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62       ** branch b
78b0: 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20  elow.  */.      
78c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
78d0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
78e0: 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70  pTab && pExpr->p
78f0: 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  Tab==pTab );.   
7900: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
7910: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
7920: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
7930: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
7940: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
7950: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
7960: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
7970: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
7980: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
7990: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
79a0: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
79b0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
79c0: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
79d0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
79e0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
79f0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
7a00: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
7a10: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pS->pEList->nExp
7a20: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
7a30: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
7a40: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
7a50: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
7a60: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
7a70: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
7a80: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
7a90: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
7aa0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
7ab0: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
7ac0: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
7ad0: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
7ae0: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
7af0: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
7b00: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7b10: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
7b20: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
7b30: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
7b40: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
7b50: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
7b60: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
7b70: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
7b80: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
7b90: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
7ba0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
7bb0: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
7bc0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
7bd0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
7be0: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
7bf0: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
7c00: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
7c10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
7c20: 57 41 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65  WAYS(pTab->pSche
7c30: 6d 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ma) ){.        /
7c40: 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a  * A real table *
7c50: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
7c60: 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20  ( !pS );.       
7c70: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
7c80: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
7c90: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7ca0: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
7cb0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
7cc0: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
7cd0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
7ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
7cf0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
7d00: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
7d10: 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b  inCol = "rowid";
7d20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7d30: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
7d40: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
7d50: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
7d60: 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d      zOriginCol =
7d70: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7d80: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7d90: 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67   }.        zOrig
7da0: 69 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e  inTab = pTab->zN
7db0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
7dc0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a   pNC->pParse ){.
7dd0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
7de0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
7df0: 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50  aToIndex(pNC->pP
7e00: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
7e10: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
7e20: 20 20 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20      zOriginDb = 
7e30: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
7e40: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
7e50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7e60: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7e70: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
7e80: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7e90: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
7ea0: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
7eb0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
7ec0: 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
7ed0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
7ee0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
7ef0: 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69  d.      ** origi
7f00: 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73  n info for the s
7f10: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  ingle column in 
7f20: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
7f30: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  f the SELECT.   
7f40: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e     ** statement.
7f50: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7f60: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
7f70: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
7f80: 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  S = pExpr->x.pSe
7f90: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
7fa0: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
7fb0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
7fc0: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
7fd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
7fe0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
7ff0: 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53   );.      sNC.pS
8000: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
8010: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
8020: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
8030: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
8040: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
8050: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
8060: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
8070: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
8080: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
8090: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
80a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
80b0: 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  }.  .  if( pzOri
80c0: 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73  ginDb ){.    ass
80d0: 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62  ert( pzOriginTab
80e0: 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20   && pzOriginCol 
80f0: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  );.    *pzOrigin
8100: 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a  Db = zOriginDb;.
8110: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62      *pzOriginTab
8120: 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20   = zOriginTab;. 
8130: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20     *pzOriginCol 
8140: 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20  = zOriginCol;.  
8150: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65  }.  return zType
8160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
8170: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
8180: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
8190: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
81a0: 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   types of column
81b0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
81c0: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
81d0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
81e0: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
81f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8200: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
8210: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
8220: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
8230: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
8240: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
8250: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
8260: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
8270: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
8280: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
8290: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
82a0: 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  E.  Vdbe *v = pP
82b0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
82c0: 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
82d0: 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70  ext sNC;.  sNC.p
82e0: 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
82f0: 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  st;.  sNC.pParse
8300: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72   = pParse;.  for
8310: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
8320: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8330: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
8340: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
8350: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8360: 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Type;.#ifdef SQL
8370: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
8380: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63  N_METADATA.    c
8390: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
83a0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  Db = 0;.    cons
83b0: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62  t char *zOrigTab
83c0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
83d0: 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  char *zOrigCol =
83e0: 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   0;.    zType = 
83f0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
8400: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
8410: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
8420: 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ol);..    /* The
8430: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
8440: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
8450: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
8460: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
8470: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
8480: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
8490: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
84a0: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
84b0: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
84c0: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
84d0: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
84e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
84f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8500: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
8510: 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54  OrigDb, SQLITE_T
8520: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
8530: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8540: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8550: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
8560: 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ab, SQLITE_TRANS
8570: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
8580: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8590: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
85a0: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
85b0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
85c0: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
85d0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
85e0: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
85f0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  0);.#endif.    s
8600: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8610: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8620: 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79  ME_DECLTYPE, zTy
8630: 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  pe, SQLITE_TRANS
8640: 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  IENT);.  }.#endi
8650: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
8660: 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a  _DECLTYPE */.}..
8670: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
8680: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
8690: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
86a0: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
86b0: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
86c0: 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66  t set.  This inf
86d0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
86e0: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a   to provide the.
86f0: 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65  ** azCol[] value
8700: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
8710: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
8720: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
8730: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
8740: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
8750: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
8760: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
8770: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
8780: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
8790: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
87a0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
87b0: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
87c0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
87d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
87e0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
87f0: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
8800: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8810: 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d  b;.  int fullNam
8820: 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a  es, shortNames;.
8830: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8840: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
8850: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
8860: 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
8870: 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
8880: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
8890: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
88a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
88b0: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
88c0: 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76  esSet || NEVER(v
88d0: 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ==0) || db->mall
88e0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
88f0: 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  n;.  pParse->col
8900: 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
8910: 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d  fullNames = (db-
8920: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
8930: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
8940: 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d  ;.  shortNames =
8950: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
8960: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
8970: 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65  es)!=0;.  sqlite
8980: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
8990: 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
89a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
89b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
89c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
89d0: 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74  ;.    p = pEList
89e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
89f0: 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
8a00: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
8a10: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
8a20: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
8a30: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
8a40: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8a50: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
8a60: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8a70: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8a80: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
8a90: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
8aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
8ab0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
8ac0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43   p->op==TK_AGG_C
8ad0: 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69  OLUMN) && pTabLi
8ae0: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
8af0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
8b00: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
8b10: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
8b20: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
8b30: 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c  r(j=0; ALWAYS(j<
8b40: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  pTabList->nSrc);
8b50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
8b60: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  f( pTabList->a[j
8b70: 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54  ].iCursor==p->iT
8b80: 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  able ) break;.  
8b90: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
8ba0: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
8bb0: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
8bc0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
8bd0: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
8be0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
8bf0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
8c00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
8c10: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
8c20: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
8c30: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
8c40: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
8c50: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
8c60: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
8c70: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
8c80: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
8c90: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
8ca0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
8cb0: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
8cc0: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
8cd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8ce0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8cf0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
8d00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8d10: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c  DbStrDup(db, pEL
8d20: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
8d30: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
8d40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
8d50: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  f( fullNames ){.
8d60: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
8d70: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
8d80: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
8d90: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
8da0: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
8db0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
8dc0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8dd0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8de0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8df0: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
8e00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8e10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8e20: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8e30: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8e40: 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
8e50: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
8e60: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8e70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8e80: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8e90: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20  COLNAME_NAME, . 
8ea0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8eb0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c  DbStrDup(db, pEL
8ec0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
8ed0: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
8ee0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67  );.    }.  }.  g
8ef0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
8f00: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
8f10: 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a  ist, pEList);.}.
8f20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8f30: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
8f40: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  LECT./*.** Name 
8f50: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
8f60: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
8f70: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
8f80: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
8f90: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
8fa0: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
8fb0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
8fc0: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
8fd0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
8fe0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
8ff0: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
9000: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
9010: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
9020: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
9030: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
9040: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
9050: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9060: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
9070: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
9080: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
9090: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
90a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
90b0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
90c0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
90d0: 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70  * Given a an exp
90e0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68  ression list (wh
90f0: 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68  ich is really th
9100: 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  e list of expres
9110: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f  sions.** that fo
9120: 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  rm the result se
9130: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  t of a SELECT st
9140: 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65  atement) compute
9150: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
9160: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
9170: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f   a table that wo
9180: 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70  uld hold the exp
9190: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
91a0: 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e  .** All column n
91b0: 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69  ames will be uni
91c0: 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  que..**.** Only 
91d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
91e0: 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20   are computed.  
91f0: 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f  Column.zType, Co
9200: 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61  lumn.zColl,.** a
9210: 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
9220: 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65  of Column are ze
9230: 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  roed..**.** Retu
9240: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
9250: 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d  success.  If a m
9260: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
9270: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
9280: 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20  * store NULL in 
9290: 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20  *paCol and 0 in 
92a0: 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72  *pnCol and retur
92b0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
92c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
92d0: 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
92e0: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
92f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
9300: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9310: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
9320: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
9330: 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20     /* Expr list 
9340: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65  from which to de
9350: 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  rive column name
9360: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f  s */.  int *pnCo
9370: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
9380: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
9390: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65  er of columns he
93a0: 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  re */.  Column *
93b0: 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20  *paCol          
93c0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77  /* Write the new
93d0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72   column list her
93e0: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
93f0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9400: 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73  db;   /* Databas
9410: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9420: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9440: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
9450: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74  /* Index added t
9480: 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20  o make the name 
9490: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75  unique */.  Colu
94a0: 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
94b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
94c0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75  ooping over resu
94d0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
94e0: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9500: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9510: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
9520: 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b  et */.  Expr *p;
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
9550: 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72  n for a single r
9560: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  esult column */.
9570: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9590: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
95a0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
95c0: 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e   Size of name in
95d0: 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 2a   zName[] */..  *
95e0: 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70  pnCol = nCol = p
95f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
9600: 61 43 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d 20  aCol = *paCol = 
9610: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
9620: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61  ero(db, sizeof(a
9630: 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20  Col[0])*nCol);. 
9640: 20 69 66 28 20 61 43 6f 6c 3d 3d 30 20 29 20 72   if( aCol==0 ) r
9650: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9660: 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  EM;.  for(i=0, p
9670: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c  Col=aCol; i<nCol
9680: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
9690: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
96a0: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
96b0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
96c0: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c    */.    p = pEL
96d0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
96e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
96f0: 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 45 78 70  pRight==0 || Exp
9700: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e  rHasProperty(p->
9710: 70 52 69 67 68 74 2c 20 45 50 5f 49 6e 74 56 61  pRight, EP_IntVa
9720: 6c 75 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  lue).           
9730: 20 20 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74      || p->pRight
9740: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 20 7c 7c  ->u.zToken==0 ||
9750: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54   p->pRight->u.zT
9760: 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  oken[0]!=0 );.  
9770: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
9780: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
9790: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
97a0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
97b0: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
97c0: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
97d0: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
97e0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
97f0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
9800: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
9810: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9820: 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45       Expr *pColE
9830: 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65  xpr = p;  /* The
9840: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
9850: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63   is the result c
9860: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
9870: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
9880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
9890: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
98a0: 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  h this expressio
98b0: 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  n */.      while
98c0: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
98d0: 54 4b 5f 44 4f 54 20 29 20 70 43 6f 6c 45 78 70  TK_DOT ) pColExp
98e0: 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
98f0: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
9900: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
9910: 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59  _COLUMN && ALWAY
9920: 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  S(pColExpr->pTab
9930: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
9940: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
9950: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
9960: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
9970: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
9980: 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
9990: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
99a0: 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a  pColExpr->pTab;.
99b0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
99c0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
99d0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
99e0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
99f0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
9a00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9a10: 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61     iCol>=0 ? pTa
9a20: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
9a30: 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a  ame : "rowid");.
9a40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9a50: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
9a60: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
9a70: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9a80: 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
9a90: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
9aa0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
9ab0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9ac0: 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45  (db, "%s", pColE
9ad0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
9ae0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9af0: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
9b00: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
9b10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
9b20: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
9b30: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e  me */.        zN
9b40: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
9b50: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70  intf(db, "%s", p
9b60: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
9b70: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
9b80: 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
9b90: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
9ba0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9bb0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
9bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9bd0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
9be0: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
9bf0: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
9c00: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
9c10: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
9c20: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
9c30: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
9c40: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
9c50: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
9c60: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
9c70: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
9c80: 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  e);.    for(j=cn
9c90: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
9ca0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9cb0: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
9cc0: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
9cd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
9ce0: 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20  r *zNewName;.   
9cf0: 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65       zName[nName
9d00: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  ] = 0;.        z
9d10: 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  NewName = sqlite
9d20: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
9d30: 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  :%d", zName, ++c
9d40: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
9d50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9d60: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a  Name);.        z
9d70: 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b  Name = zNewName;
9d80: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b  .        j = -1;
9d90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
9da0: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  me==0 ) break;. 
9db0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9dc0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
9dd0: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Name;.  }.  if( 
9de0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9df0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
9e00: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
9e10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9e20: 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  db, aCol[j].zNam
9e30: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
9e40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9e50: 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f  aCol);.    *paCo
9e60: 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f  l = 0;.    *pnCo
9e70: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  l = 0;.    retur
9e80: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9e90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9ea0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9eb0: 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f   Add type and co
9ec0: 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
9ed0: 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  ion to a column 
9ee0: 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  list based on.**
9ef0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
9f00: 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ent..** .** The 
9f10: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73  column list pres
9f20: 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d  umably came from
9f30: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d   selectColumnNam
9f40: 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  esFromExprList()
9f50: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ..** The column 
9f60: 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61  list has only na
9f70: 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f  mes, not types o
9f80: 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54  r collations.  T
9f90: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
9fa0: 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20  oes through and 
9fb0: 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61  adds the types a
9fc0: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a  nd collations..*
9fd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9fe0: 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
9ff0: 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20  all identifiers 
a000: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  in the SELECT.**
a010: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65   statement be re
a020: 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  solved..*/.stati
a030: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
a040: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
a050: 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20  lation(.  Parse 
a060: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
a070: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a080: 78 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  xts */.  int nCo
a090: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
a0a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
a0b0: 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  mns */.  Column 
a0c0: 2a 61 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f  *aCol,         /
a0d0: 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
a0e0: 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
a0f0: 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
a100: 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
a110: 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
a120: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
a130: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
a140: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a150: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
a160: 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
a170: 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
a180: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
a190: 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
a1a0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a1b0: 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *a;..  assert( p
a1c0: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
a1d0: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
a1e0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
a1f0: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
a200: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70   assert( nCol==p
a210: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
a220: 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
a230: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
a240: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
a250: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
a260: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
a270: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
a280: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
a290: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
a2a0: 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  a = pSelect->pEL
a2b0: 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  ist->a;.  for(i=
a2c0: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
a2d0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
a2e0: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d  +){.    p = a[i]
a2f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c  .pExpr;.    pCol
a300: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
a310: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f  3DbStrDup(db, co
a320: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
a330: 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20  , 0, 0, 0));.   
a340: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
a350: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
a360: 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66  inity(p);.    if
a370: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
a380: 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69  ==0 ) pCol->affi
a390: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
a3a0: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c  F_NONE;.    pCol
a3b0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
a3c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
a3d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
a3e0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e   ){.      pCol->
a3f0: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44  zColl = sqlite3D
a400: 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c  bStrDup(db, pCol
a410: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
a420: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
a430: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
a440: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
a450: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
a460: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
a470: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
a480: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
a490: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
a4a0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
a4b0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
a4c0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
a4d0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
a4e0: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
a4f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a500: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
a510: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
a520: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
a530: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
a540: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
a550: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
a560: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
a570: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
a580: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
a590: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
a5a0: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
a5b0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
a5c0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
a5d0: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
a5e0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
a5f0: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
a600: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
a610: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
a620: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
a630: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
a640: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
a650: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a660: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
a670: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
a680: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
a690: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
a6a0: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
a6b0: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
a6c0: 6c 65 64 2c 20 73 6f 20 77 65 20 6d 69 67 68 74  led, so we might
a6d0: 20 61 73 20 77 65 6c 6c 20 68 61 72 64 2d 63 6f   as well hard-co
a6e0: 64 65 20 70 54 61 62 2d 3e 64 62 4d 65 6d 20 74  de pTab->dbMem t
a6f0: 6f 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73  o NULL. */.  ass
a700: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
a710: 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29  de.bEnabled==0 )
a720: 3b 0a 20 20 70 54 61 62 2d 3e 64 62 4d 65 6d 20  ;.  pTab->dbMem 
a730: 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65  = 0;.  pTab->nRe
a740: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
a750: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73 65 6c 65  Name = 0;.  sele
a760: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
a770: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
a780: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26  elect->pEList, &
a790: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
a7a0: 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65  b->aCol);.  sele
a7b0: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
a7c0: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
a7d0: 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  se, pTab->nCol, 
a7e0: 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c  pTab->aCol, pSel
a7f0: 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
a800: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
a810: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a820: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
a830: 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61 62 29  eleteTable(pTab)
a840: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
a850: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
a860: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  b;.}../*.** Get 
a870: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
a880: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
a890: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
a8a0: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
a8b0: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
a8c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
a8d0: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
a8e0: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
a8f0: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
a900: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
a910: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
a920: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a930: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
a940: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
a950: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
a960: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
a970: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23  e(pParse->db);.#
a980: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a990: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28  IT_TRACE.    if(
a9a0: 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69   v ){.      sqli
a9b0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
a9c0: 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20 20 20   OP_Trace);.    
a9d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  }.#endif.  }.  r
a9e0: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn v;.}.../*.
a9f0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
aa00: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
aa10: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
aa20: 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
aa30: 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
aa40: 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
aa50: 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
aa60: 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
aa70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
aa80: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
aa90: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
aaa0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
aab0: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
aac0: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
aad0: 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
aae0: 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
aaf0: 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
ab00: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
ab10: 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
ab20: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
ab30: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
ab40: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
ab50: 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
ab60: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
ab70: 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
ab80: 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
ab90: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
aba0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
abb0: 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
abc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
abd0: 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
abe0: 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
abf0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
ac00: 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
ac10: 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
ac20: 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
ac30: 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
ac40: 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
ac50: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
ac60: 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
ac70: 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
ac80: 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73  lt values.** (us
ac90: 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c  ually but not al
aca0: 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74  ways -1) prior t
acb0: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
acc0: 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20  outine..** Only 
acd0: 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20  if pLimit!=0 or 
ace0: 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68  pOffset!=0 do th
acf0: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
ad00: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
ad10: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
ad20: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
ad30: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
ad40: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
ad50: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
ad60: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
ad70: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
ad80: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
ad90: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
ada0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
adb0: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
adc0: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
add0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
ade0: 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
adf0: 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
ae00: 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
ae10: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
ae20: 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20  int addr1, n;.  
ae30: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
ae40: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
ae50: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
ae60: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
ae70: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
ae80: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61  some.  ** contra
ae90: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
aea0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
aeb0: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
aec0: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
aed0: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
aee0: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
aef0: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
af00: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
af10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
af20: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
af30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
af40: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Offset==0 || p->
af50: 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  pLimit!=0 );.  i
af60: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
af70: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
af80: 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
af90: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
afa0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
afb0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
afc0: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
afd0: 65 74 75 72 6e 3b 20 20 2f 2a 20 56 44 42 45 20  eturn;  /* VDBE 
afe0: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
aff0: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
b000: 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  ed */.    if( sq
b010: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
b020: 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e  er(p->pLimit, &n
b030: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ) ){.      if( n
b040: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
b050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b060: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
b070: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
b080: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b0a0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
b0b0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
b0c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
b0d0: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
b0e0: 72 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r"));.      }.  
b0f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
b100: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b110: 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
b120: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
b130: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b140: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
b150: 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  nt, iLimit);.   
b160: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
b170: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
b180: 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
b190: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b1a0: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d   OP_IfZero, iLim
b1b0: 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  it, iBreak);.   
b1c0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f   }.    if( p->pO
b1d0: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70  ffset ){.      p
b1e0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
b1f0: 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
b200: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72  nMem;.      pPar
b210: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a  se->nMem++;   /*
b220: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74   Allocate an ext
b230: 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ra register for 
b240: 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a  limit+offset */.
b250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b260: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
b270: 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65  >pOffset, iOffse
b280: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
b290: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b2a0: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
b2b0: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  fset);.      Vdb
b2c0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
b2d0: 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  FSET counter"));
b2e0: 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
b2f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b300: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
b310: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
b320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b330: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
b340: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
b350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
b360: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
b370: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b380: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
b390: 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66  dd, iLimit, iOff
b3a0: 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b  set, iOffset+1);
b3b0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
b3c0: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46  nt((v, "LIMIT+OF
b3d0: 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61  FSET"));.      a
b3e0: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
b3f0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
b400: 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  fPos, iLimit);. 
b410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b420: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
b430: 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65  eger, -1, iOffse
b440: 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t+1);.      sqli
b450: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b460: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d  v, addr1);.    }
b470: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
b480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
b490: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
b4a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
b4b0: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
b4c0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
b4d0: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
b4e0: 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
b4f0: 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
b500: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
b510: 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
b520: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
b530: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
b540: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
b550: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
b560: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
b570: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
b580: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
b590: 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
b5a0: 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
b5b0: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
b5c0: 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
b5d0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
b5e0: 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
b5f0: 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
b600: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
b610: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
b620: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
b630: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
b640: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
b650: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
b660: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
b670: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
b680: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
b690: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
b6a0: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
b6b0: 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69  ( iCol>=0 );.  i
b6c0: 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43  f( pRet==0 && iC
b6d0: 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ol<p->pEList->nE
b6e0: 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  xpr ){.    pRet 
b6f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
b700: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
b710: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
b720: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
b730: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e  turn pRet;.}.#en
b740: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
b750: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
b760: 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  CT */../* Forwar
b770: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
b780: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
b790: 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
b7a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b7b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b7c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
b7d0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
b7e0: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
b7f0: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
b800: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
b810: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
b820: 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
b830: 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
b840: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a   results */.);..
b850: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b860: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
b870: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LECT./*.** This 
b880: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b890: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63  d to process a c
b8a0: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f  ompound query fo
b8b0: 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f  rm from.** two o
b8c0: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
b8d0: 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e  queries using UN
b8e0: 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  ION, UNION ALL, 
b8f0: 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e  EXCEPT, or.** IN
b900: 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70  TERSECT.**.** "p
b910: 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  " points to the 
b920: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68  right-most of th
b930: 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20  e two queries.  
b940: 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65  the query on the
b950: 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70  .** left is p->p
b960: 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74  Prior.  The left
b970: 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73   query could als
b980: 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  o be a compound 
b990: 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63  query.** in whic
b9a0: 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  h case this rout
b9b0: 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
b9c0: 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
b9d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
b9e0: 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  ts of the total 
b9f0: 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20  query are to be 
ba00: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64  written into a d
ba10: 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  estination.** of
ba20: 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68   type eDest with
ba30: 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d   parameter iParm
ba40: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
ba50: 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74  1:  Consider a t
ba60: 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e  hree-way compoun
ba70: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
ba80: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
ba90: 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T a FROM t1 UNIO
baa0: 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
bab0: 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
bac0: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20  c FROM t3.**.** 
bad0: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
bae0: 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66  s parsed up as f
baf0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
bb00: 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20    SELECT c FROM 
bb10: 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20  t3.**      |.** 
bb20: 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45       `----->  SE
bb30: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a  LECT b FROM t2.*
bb40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
bb50: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
bb60: 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53       `------>  S
bb70: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a  ELECT a FROM t1.
bb80: 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73  **.** The arrows
bb90: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20   in the diagram 
bba0: 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20  above represent 
bbb0: 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f  the Select.pPrio
bbc0: 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f  r pointer..** So
bbd0: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
bbe0: 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
bbf0: 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  p equal to the t
bc00: 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  3 query, then.**
bc10: 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20   pPrior will be 
bc20: 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70  the t2 query.  p
bc30: 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f  ->op will be TK_
bc40: 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61  UNION in this ca
bc50: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65  se..**.** Notice
bc60: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66   that because of
bc70: 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20   the way SQLite 
bc80: 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20  parses compound 
bc90: 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20  SELECTs, the.** 
bca0: 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
bcb0: 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20  ts always group 
bcc0: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
bcd0: 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ht..*/.static in
bce0: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20  t multiSelect(. 
bcf0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
bd00: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
bd10: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
bd20: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
bd30: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
bd40: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
bd50: 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
bd60: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
bd70: 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
bd80: 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
bd90: 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
bda0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
bdb0: 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65  E_OK;   /* Succe
bdc0: 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
bdd0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
bde0: 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
bdf0: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
be00: 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
be10: 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
be20: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
be30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
be40: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
be50: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
be60: 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
be70: 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76     /* Alternativ
be80: 65 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69  e data destinati
be90: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
bea0: 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a  pDelete = 0;  /*
beb0: 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65   Chain of simple
bec0: 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65   selects to dele
bed0: 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
bee0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
bef0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
bf00: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61  tion */..  /* Ma
bf10: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
bf20: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
bf30: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
bf40: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
bf50: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
bf60: 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
bf70: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
bf80: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
bf90: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
bfa0: 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  IT..  */.  asser
bfb0: 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f  t( p && p->pPrio
bfc0: 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  r );  /* Calling
bfd0: 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e   function guaran
bfe0: 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a  tees this much *
bff0: 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
c000: 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
c010: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
c020: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
c030: 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20  ghtmost!=pPrior 
c040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  );.  assert( pPr
c050: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ior->pRightmost=
c060: 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29  =p->pRightmost )
c070: 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
c080: 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
c090: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
c0a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c0b0: 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
c0c0: 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
c0d0: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
c0e0: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
c0f0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
c100: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
c110: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
c120: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c130: 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
c140: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
c150: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c160: 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
c170: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
c180: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
c190: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
c1a0: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
c1b0: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
c1c0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c1d0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
c1e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c1f0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
c200: 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
c210: 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
c220: 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
c230: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
c240: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
c250: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
c260: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
c270: 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
c280: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
c290: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
c2a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
c2b0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
c2c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c2d0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
c2e0: 65 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d  eral, dest.iParm
c2f0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
c300: 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44  pr);.    dest.eD
c310: 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
c320: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
c330: 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
c340: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
c350: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
c360: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
c370: 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
c380: 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
c390: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
c3a0: 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
c3b0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66  ->pEList );.  if
c3c0: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
c3d0: 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr!=pPrior->pELi
c3e0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
c3f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c400: 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
c410: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
c420: 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
c430: 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
c440: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
c450: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
c460: 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
c470: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
c480: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
c490: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c4a0: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  nd;.  }..  /* Co
c4b0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
c4c0: 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
c4d0: 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
c4e0: 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
c4f0: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
c500: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
c510: 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
c520: 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
c530: 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
c540: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
c550: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
c560: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
c570: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
c580: 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
c590: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
c5a0: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
c5b0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a    int addr = 0;.
c5c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
c5d0: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
c5e0: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
c5f0: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
c600: 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
c610: 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
c620: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 72 63 20  ffset;.      rc 
c630: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
c640: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
c650: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  &dest);.      p-
c660: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
c670: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
c680: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  0;.      if( rc 
c690: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
c6a0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c6b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c6c0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
c6d0: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
c6e0: 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
c6f0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
c700: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
c710: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  set;.      if( p
c720: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
c730: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
c740: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c750: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
c760: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56  imit);.        V
c770: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
c780: 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49  Jump ahead if LI
c790: 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a  MIT reached"));.
c7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
c7b0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c7c0: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
c7d0: 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
c7e0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
c7f0: 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
c800: 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
c810: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
c820: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
c830: 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
c840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c850: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
c860: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c870: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c880: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
c890: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
c8a0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
c8b0: 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
c8c0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
c8d0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
c8e0: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
c8f0: 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ult */.      u8 
c900: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  op = 0;       /*
c910: 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
c920: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
c930: 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
c940: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
c950: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
c960: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
c970: 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
c980: 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
c990: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
c9a0: 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
c9b0: 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
c9c0: 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
c9d0: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
c9e0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
c9f0: 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
ca00: 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
ca10: 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
ca20: 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
ca30: 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
ca40: 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
ca50: 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
ca60: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
ca70: 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
ca80: 72 4f 70 20 26 26 20 41 4c 57 41 59 53 28 21 70  rOp && ALWAYS(!p
ca90: 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d 3e 70  ->pLimit &&!p->p
caa0: 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 20  Offset) ){.     
cab0: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
cac0: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
cad0: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
cae0: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
caf0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
cb00: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
cb10: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cb20: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 20  ->pRightmost!=p 
cb30: 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20  );  /* Can only 
cb40: 68 61 70 70 65 6e 20 66 6f 72 20 6c 65 66 74 77  happen for leftw
cb50: 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20  ard elements.   
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb80: 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61 79 20    ** of a 3-way 
cb90: 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75 6e 64  or more compound
cba0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
cbb0: 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
cbc0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
cbd0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
cbe0: 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
cbf0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
cc00: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
cc10: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
cc20: 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
cc30: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
cc40: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
cc50: 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20  est.iParm;.     
cc60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cc70: 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
cc80: 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
cc90: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
cca0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
ccb0: 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
ccc0: 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
ccd0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
cce0: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61    unionTab = pPa
ccf0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
cd00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
cd10: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
cd20: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
cd30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cd40: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
cd50: 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ral, unionTab, 0
cd60: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
cd70: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
cd80: 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
cd90: 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70         p->addrOp
cda0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
cdb0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69  ;.        p->pRi
cdc0: 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67  ghtmost->selFlag
cdd0: 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
cde0: 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
cdf0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
ce00: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
ce10: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
ce20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
ce30: 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
ce40: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
ce50: 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
ce60: 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
ce70: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
ce80: 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
ce90: 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
cea0: 61 62 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ab);.      rc = 
ceb0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
cec0: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
ced0: 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
cee0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
cef0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
cf00: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
cf10: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
cf20: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
cf30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
cf40: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
cf50: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
cf60: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
cf70: 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
cf80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cf90: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
cfa0: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
cfb0: 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
cfc0: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
cfd0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
cfe0: 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
cff0: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
d000: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
d010: 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
d020: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
d030: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
d040: 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
d050: 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
d060: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d070: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
d080: 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b   p, &uniondest);
d090: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
d0a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d0b0: 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79  ;.      /* Query
d0c0: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73   flattening in s
d0d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d  qlite3Select() m
d0e0: 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70  ight refill p->p
d0f0: 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a  OrderBy..      *
d100: 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
d110: 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
d120: 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
d130: 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
d140: 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ak. */.      sql
d150: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
d160: 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
d170: 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  By);.      pDele
d180: 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
d190: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
d1a0: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
d1b0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
d1c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d1d0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
d1e0: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
d1f0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
d200: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
d210: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
d220: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
d230: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   0;.      p->iOf
d240: 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  fset = 0;..     
d250: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
d260: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
d270: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
d280: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
d290: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
d2a0: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
d2b0: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
d2c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
d2d0: 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 50 61 72  onTab==dest.iPar
d2e0: 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21  m || dest.eDest!
d2f0: 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20  =priorOp );.    
d300: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
d310: 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  !=priorOp ){.   
d320: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
d330: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
d340: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d350: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
d360: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
d370: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
d380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
d390: 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
d3a0: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
d3b0: 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
d3c0: 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
d3d0: 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
d3e0: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
d3f0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
d400: 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
d410: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
d420: 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
d430: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d440: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d450: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
d460: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d470: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
d480: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
d490: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
d4a0: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
d4b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d4c0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
d4d0: 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a  onTab, iBreak);.
d4e0: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
d4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d500: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
d510: 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
d520: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
d530: 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
d540: 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ab, p->pEList->n
d550: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
d570: 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e   -1, &dest, iCon
d580: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
d590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
d5a0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
d5b0: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
d5c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d5d0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
d5e0: 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a  onTab, iStart);.
d5f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d600: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d610: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
d620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d630: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
d640: 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
d650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
d660: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d670: 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
d680: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
d690: 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
d6a0: 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
d6b0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
d6c0: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
d6d0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
d6e0: 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
d6f0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
d700: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
d710: 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
d720: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20       int r1;..  
d730: 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
d740: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
d750: 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
d760: 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
d770: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
d780: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
d790: 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
d7a0: 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
d7b0: 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
d7c0: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
d7d0: 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
d7e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d7f0: 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
d800: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
d810: 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
d820: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b++;.      asser
d830: 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
d840: 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72  0 );..      addr
d850: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d860: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
d870: 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20  phemeral, tab1, 
d880: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
d890: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
d8a0: 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
d8b0: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
d8c0: 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
d8d0: 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
d8e0: 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  st->selFlags |= 
d8f0: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
d900: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d910: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20  p->pEList );..  
d920: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
d930: 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c  SELECTs to our l
d940: 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  eft into tempora
d950: 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e  ry table "tab1".
d960: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d970: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
d980: 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74  tInit(&intersect
d990: 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  dest, SRT_Union,
d9a0: 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 72 63   tab1);.      rc
d9b0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d9c0: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
d9d0: 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
d9e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d9f0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
da00: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
da10: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
da20: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
da30: 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
da40: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
da50: 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
da60: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
da70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
da80: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
da90: 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  al, tab2, 0);.  
daa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
dab0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
dac0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
dad0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
dae0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
daf0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
db00: 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
db10: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
db20: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
db30: 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
db40: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
db50: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
db60: 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65       intersectde
db70: 73 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32 3b  st.iParm = tab2;
db80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
db90: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
dba0: 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64  , p, &intersectd
dbb0: 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
dbc0: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
dbd0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
dbe0: 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
dbf0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
dc00: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
dc10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
dc20: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
dc30: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
dc40: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
dc50: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
dc60: 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
dc70: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
dc80: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
dc90: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
dca0: 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
dcb0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
dcc0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
dcd0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
dce0: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
dcf0: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
dd00: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
dd10: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
dd20: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
dd30: 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
dd40: 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
dd50: 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
dd60: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
dd70: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
dd80: 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
dd90: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
dda0: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
ddb0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
ddc0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
ddd0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
dde0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
ddf0: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
de00: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
de10: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
de20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
de30: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
de40: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
de50: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
de60: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
de70: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53  Parse);.      iS
de80: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
de90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
dea0: 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29  owKey, tab1, r1)
deb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dec0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
ded0: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
dee0: 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29  2, iCont, r1, 0)
def0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
df00: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
df10: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
df20: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
df30: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
df40: 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e  EList, tab1, p->
df50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73       0, -1, &des
df80: 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
df90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dfa0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
dfb0: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
dfc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dfd0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
dfe0: 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20  tab1, iStart);. 
dff0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e000: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
e010: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
e020: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e030: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
e040: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
e050: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e060: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
e070: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
e080: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
e090: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
e0a0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
e0b0: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65  used by .  ** te
e0c0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e  mporary tables n
e0d0: 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  eeded to impleme
e0e0: 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  nt the compound 
e0f0: 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74  select..  ** Att
e100: 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ach the KeyInfo 
e110: 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c  structure to all
e120: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e130: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
e140: 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e  s section is run
e150: 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   by the right-mo
e160: 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
e170: 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53  ent only..  ** S
e180: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e190: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77   to the left alw
e1a0: 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61  ays skip this pa
e1b0: 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rt.  The right-m
e1c0: 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ost.  ** SELECT 
e1d0: 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20  might also skip 
e1e0: 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20  this part if it 
e1f0: 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20  has no ORDER BY 
e200: 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20  clause and.  ** 
e210: 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61  no temp tables a
e220: 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  re required..  *
e230: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
e240: 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68  ags & SF_UsesEph
e250: 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e  emeral ){.    in
e260: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
e270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e280: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
e290: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
e2a0: 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
e2b0: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
e2c0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
e2d0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
e2e0: 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20   Select *pLoop; 
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e300: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
e310: 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61  rough SELECT sta
e320: 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43  tements */.    C
e330: 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b  ollSeq **apColl;
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e350: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
e360: 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  ugh pKeyInfo->aC
e370: 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  oll[] */.    int
e380: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
e390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
e3a0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
e3b0: 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  in result set */
e3c0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
e3d0: 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29  >pRightmost==p )
e3e0: 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e  ;.    nCol = p->
e3f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
e400: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
e410: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
e420: 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  o(db,.          
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
e440: 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e  eof(*pKeyInfo)+n
e450: 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  Col*(sizeof(Coll
e460: 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20  Seq*) + 1));.   
e470: 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
e480: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
e490: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
e4a0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
e4b0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
e4c0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63     pKeyInfo->enc
e4d0: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
e4e0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
e4f0: 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a 20   = (u16)nCol;.. 
e500: 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
e510: 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
e520: 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
e530: 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
e540: 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
e550: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
e560: 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
e570: 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
e580: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
e590: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
e5a0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
e5b0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c     }..    for(pL
e5c0: 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
e5d0: 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
e5e0: 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
e5f0: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
e600: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
e610: 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
e620: 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
e630: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
e640: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
e650: 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
e660: 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
e670: 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
e680: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
e690: 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
e6a0: 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
e6b0: 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
e6c0: 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
e6d0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
e6e0: 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
e6f0: 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
e700: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e720: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e730: 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
e740: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
e750: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
e760: 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
e770: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
e780: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
e790: 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
e7a0: 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
e7b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
e7c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e7d0: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
e7e0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e7f0: 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20  :.  pDest->iMem 
e800: 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70  = dest.iMem;.  p
e810: 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73  Dest->nMem = des
e820: 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  t.nMem;.  sqlite
e830: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
e840: 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
e850: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
e860: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e870: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
e880: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
e890: 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
e8a0: 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
e8b0: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
e8c0: 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
e8d0: 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
e8e0: 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
e8f0: 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
e900: 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d  ained in pIn->iM
e910: 65 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a  em.  There are.*
e920: 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75  * pIn->nMem colu
e930: 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
e940: 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
e950: 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
e960: 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
e970: 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
e980: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
e990: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
e9a0: 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
e9b0: 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
e9c0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
e9d0: 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
e9e0: 69 74 20 69 73 20 61 20 74 68 65 20 66 69 72 73  it is a the firs
e9f0: 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
ea00: 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
ea10: 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
ea20: 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
ea30: 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
ea40: 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
ea50: 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
ea60: 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
ea70: 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
ea80: 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
ea90: 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
eaa0: 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
eab0: 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
eac0: 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
ead0: 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
eae0: 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
eaf0: 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
eb00: 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
eb10: 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
eb20: 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
eb30: 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
eb40: 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
eb50: 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
eb60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
eb70: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
eb80: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
eb90: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
eba0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
ebb0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
ebc0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
ebd0: 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
ebe0: 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
ebf0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
ec00: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
ec10: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
ec20: 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
ec30: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
ec40: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
ec50: 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
ec60: 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
ec70: 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
ec80: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
ec90: 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
eca0: 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
ecb0: 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
ecc0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
ecd0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
ece0: 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
ecf0: 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
ed00: 69 6e 74 20 70 34 74 79 70 65 2c 20 20 20 20 20  int p4type,     
ed10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
ed20: 34 20 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49  4 type for pKeyI
ed30: 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  nfo */.  int iBr
ed40: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
ed50: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
ed60: 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49   we hit the LIMI
ed70: 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  T */.){.  Vdbe *
ed80: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
ed90: 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  e;.  int iContin
eda0: 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  ue;.  int addr;.
edb0: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
edc0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
edd0: 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65  (v);.  iContinue
ede0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
edf0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
ee00: 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69  * Suppress dupli
ee10: 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c  cates for UNION,
ee20: 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
ee30: 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69  ERSECT .  */.  i
ee40: 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20  f( regPrev ){.  
ee50: 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20    int j1, j2;.  
ee60: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
ee70: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
ee80: 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a  fNot, regPrev);.
ee90: 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33      j2 = sqlite3
eea0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
eeb0: 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
eec0: 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  Mem, regPrev+1, 
eed0: 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20  pIn->nMem,.     
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
ef00: 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65  pKeyInfo, p4type
ef10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ef20: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
ef30: 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74  ump, j2+2, iCont
ef40: 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20  inue, j2+2);.   
ef50: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
ef60: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
ef70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ef80: 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e  Copy(pParse, pIn
ef90: 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b  ->iMem, regPrev+
efa0: 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20  1, pIn->nMem);. 
efb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
efc0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
efd0: 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b  er, 1, regPrev);
efe0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
eff0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
f000: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
f010: 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
f020: 68 65 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  he the first OFF
f030: 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
f040: 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
f050: 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
f060: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
f070: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
f080: 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
f090: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
f0a0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
f0b0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
f0c0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
f0d0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
f0e0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
f0f0: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
f100: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
f110: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
f120: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
f130: 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
f140: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
f150: 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
f160: 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  se( pDest->eDest
f170: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
f180: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f190: 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
f1a0: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
f1b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f1c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
f1d0: 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d  ecord, pIn->iMem
f1e0: 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29  , pIn->nMem, r1)
f1f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f200: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f210: 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
f220: 3e 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20  >iParm, r2);.   
f230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f240: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
f250: 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  t, pDest->iParm,
f260: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
f270: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f280: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
f290: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c  PEND);.      sql
f2a0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
f2b0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
f2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
f2d0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
f2e0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
f2f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
f300: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f310: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
f320: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
f330: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
f340: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
f350: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
f360: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
f370: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
f380: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
f390: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
f3a0: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
f3b0: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
f3c0: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
f3d0: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
f3e0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
f3f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
f400: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
f410: 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20  n->nMem==1 );.  
f420: 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20      p->affinity 
f430: 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  = .         sqli
f440: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
f450: 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ty(p->pEList->a[
f460: 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
f470: 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20  >affinity);.    
f480: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
f490: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
f4a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f4b0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
f4c0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
f4d0: 3e 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70  >iMem, 1, r1, &p
f4e0: 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a  ->affinity, 1);.
f4f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f500: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
f510: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
f520: 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  ->iMem, 1);.    
f530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f540: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
f550: 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  ert, pDest->iPar
f560: 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  m, r1);.      sq
f570: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
f580: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
f590: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f5a0: 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e    }..#if 0  /* N
f5b0: 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61  ever occurs on a
f5c0: 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79  n ORDER BY query
f5d0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   */.    /* If an
f5e0: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
f5f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
f600: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
f610: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
f620: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
f630: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
f640: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f650: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
f660: 31 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29  1, pDest->iParm)
f670: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
f680: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
f690: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
f6a0: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
f6b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f6c0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
f6d0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
f6e0: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
f6f0: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
f700: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
f710: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
f720: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
f730: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
f740: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
f750: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
f760: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
f770: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
f780: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
f790: 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d  ssert( pIn->nMem
f7a0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
f7b0: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
f7c0: 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d  (pParse, pIn->iM
f7d0: 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  em, pDest->iParm
f7e0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
f7f0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
f800: 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
f810: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
f820: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
f830: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
f840: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
f850: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
f860: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
f870: 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
f880: 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
f890: 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
f8a0: 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
f8b0: 65 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 6e  est->iMem.  Then
f8c0: 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
f8d0: 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  yields..    */. 
f8e0: 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f     case SRT_Coro
f8f0: 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  utine: {.      i
f900: 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d  f( pDest->iMem==
f910: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
f920: 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74  st->iMem = sqlit
f930: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
f940: 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  Parse, pIn->nMem
f950: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  );.        pDest
f960: 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d  ->nMem = pIn->nM
f970: 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
f980: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f990: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
f9a0: 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  n->iMem, pDest->
f9b0: 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65  iMem, pDest->nMe
f9c0: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
f9d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f9e0: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
f9f0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  iParm);.      br
fa00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
fa10: 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
fa20: 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
fa30: 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
fa40: 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
fa50: 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
fa60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
fa70: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
fa80: 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
fa90: 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
faa0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
fab0: 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
fac0: 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
fad0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
fae0: 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
faf0: 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
fb00: 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
fb10: 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
fb20: 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
fb30: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
fb40: 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
fb50: 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
fb60: 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
fb70: 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
fb80: 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
fb90: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
fba0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
fbb0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
fbc0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
fbd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fbe0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
fbf0: 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  tRow, pIn->iMem,
fc00: 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20   pIn->nMem);.   
fc10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
fc20: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
fc30: 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
fc40: 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b  Mem, pIn->nMem);
fc50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fc60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75    }.  }..  /* Ju
fc70: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
fc80: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
fc90: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
fca0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
fcb0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
fcc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fcd0: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
fce0: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
fcf0: 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  , -1);.  }..  /*
fd00: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
fd10: 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
fd20: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
fd30: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
fd40: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
fd50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fd60: 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
fd70: 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
fd80: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
fd90: 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
fda0: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
fdb0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
fdc0: 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
fdd0: 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
fde0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
fdf0: 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
fe00: 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
fe10: 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
fe20: 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
fe30: 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
fe40: 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
fe50: 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
fe60: 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
fe70: 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
fe80: 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
fe90: 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
fea0: 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
feb0: 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
fec0: 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
fed0: 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
fee0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
fef0: 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
ff00: 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
ff10: 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
ff20: 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
ff30: 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
ff40: 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
ff50: 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
ff60: 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
ff70: 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
ff80: 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
ff90: 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
ffa0: 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
ffb0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
ffc0: 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
ffd0: 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
ffe0: 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
fff0: 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
10000 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
10010 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
10020 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
10030 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
10040 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
10050 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
10060 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
10080 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
10090 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
100a0 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
100b0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
100c0 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
100d0 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
100e0 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
100f0 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
10100 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
10110 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
10120 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
10130 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
10140 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
10150 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
10160 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
10170 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
10180 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
10190 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
101a0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
101b0 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
101c0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
101d0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
101e0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
101f0 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
10200 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
10210 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
10220 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
10230 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
10240 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
10250 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
10260 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
10270 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
10280 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
10290 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
102a0 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
102b0 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
102c0 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
102d0 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
102e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
102f0 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
10300 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
10310 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
10320 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
10330 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
10340 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
10350 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
10360 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
10370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
10380 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
10390 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
103a0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
103b0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
103c0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
103d0 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
103e0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
103f0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
10400 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
10410 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
10420 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
10430 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
10440 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
10450 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
10460 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
10470 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
10480 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
10490 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
104a0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
104b0 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
104c0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
104d0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
104e0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
104f0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
10500 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
10510 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
10520 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
10530 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
10540 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
10550 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
10560 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
10570 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
10580 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
10590 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
105a0 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
105b0 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
105c0 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
105d0 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
105e0 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
105f0 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
10600 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
10610 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
10620 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
10630 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
10640 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
10650 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
10660 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
10670 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
10680 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
10690 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
106a0 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
106b0 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
106c0 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
106d0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
106e0 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
106f0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
10700 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
10710 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
10720 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
10730 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
10740 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
10750 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
10760 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
10770 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
10780 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
10790 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
107a0 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
107b0 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
107c0 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
107d0 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
107e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
107f0 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
10800 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
10810 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
10820 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
10830 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
10840 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
10850 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
10860 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
10870 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
10880 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
10890 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
108a0 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
108b0 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
108c0 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
108d0 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
108e0 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
108f0 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
10900 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
10910 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
10920 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
10930 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
10940 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
10950 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
10960 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
10970 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
10980 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
10990 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
109a0 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
109b0 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
109c0 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
109d0 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
109e0 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
109f0 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
10a00 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
10a10 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
10a20 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
10a30 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
10a40 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
10a50 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
10a60 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
10a70 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
10a80 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
10a90 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
10aa0 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
10ab0 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
10ac0 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
10ad0 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
10ae0 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
10af0 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
10b00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
10b10 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
10b20 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
10b30 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
10b40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10b50 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
10b60 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10b70 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
10b80 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
10b90 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
10ba0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
10bb0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
10bc0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
10bd0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
10be0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
10bf0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
10c00 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
10c10 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
10c20 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
10c30 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
10c40 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
10c50 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
10c60 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
10c70 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
10c80 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
10c90 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
10ca0 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
10cb0 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
10cc0 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
10cd0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
10ce0 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
10cf0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
10d00 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
10d10 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
10d20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
10d30 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
10d40 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
10d50 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20  .  int regEofA; 
10d60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
10d70 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65   to indicate whe
10d80 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f  n select-A is co
10d90 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  mplete */.  int 
10da0 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20  regAddrB;       
10db0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
10dc0 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
10dd0 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
10de0 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20    int regEofB;  
10df0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
10e00 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e  to indicate when
10e10 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d   select-B is com
10e20 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61  plete */.  int a
10e30 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20  ddrSelectA;     
10e40 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10e50 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  he select-A coro
10e60 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
10e70 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20  ddrSelectB;     
10e80 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10e90 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  he select-B coro
10ea0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
10eb0 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  egOutA;         
10ec0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
10ed0 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
10ee0 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
10ef0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
10f00 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  B;          /* A
10f10 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
10f20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42  for the output-B
10f30 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
10f40 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20   int addrOutA;  
10f50 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10f60 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
10f70 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
10f80 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d    int addrOutB =
10f90 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65   0;     /* Addre
10fa0 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
10fb0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
10fc0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b  .  int addrEofA;
10fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10fe0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
10ff0 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-A-exhausted su
11000 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
11010 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20  t addrEofB;     
11020 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
11030 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65  f the select-B-e
11040 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
11050 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
11060 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAltB;         /
11070 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
11080 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A<B subroutine 
11090 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71  */.  int addrAeq
110a0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
110b0 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d  dress of the A==
110c0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
110d0 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20    int addrAgtB; 
110e0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
110f0 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75  ss of the A>B su
11100 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
11110 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20  t regLimitA;    
11120 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
11130 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
11140 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  -A */.  int regL
11150 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a  imitB;        /*
11160 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
11170 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
11180 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
11190 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e          /* A ran
111a0 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
111b0 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73  to hold previous
111c0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
111d0 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20   savedLimit;    
111e0 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
111f0 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a  e of p->iLimit *
11200 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66  /.  int savedOff
11210 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76  set;      /* Sav
11220 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
11230 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  Offset */.  int 
11240 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20  labelCmpr;      
11250 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
11260 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
11270 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
11280 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e  */.  int labelEn
11290 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  d;         /* La
112a0 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20  bel for the end 
112b0 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53  of the overall S
112c0 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20  ELECT stmt */.  
112d0 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20  int j1;         
112e0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e        /* Jump in
112f0 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
11300 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20  get retargetted 
11310 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
11320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
11330 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f  e of TK_ALL, TK_
11340 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
11350 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a  , TK_INTERSECT *
11360 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
11370 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d  yDup = 0; /* Com
11380 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
11390 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
113a0 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b  e removal */.  K
113b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67  eyInfo *pKeyMerg
113c0 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73  e;   /* Comparis
113d0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
113e0 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20  or merging rows 
113f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11400 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
11410 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11420 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
11430 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
11440 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
11450 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  use */.  int nOr
11460 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
11470 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
11480 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
11490 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
114a0 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20  t *aPermute;    
114b0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
114c0 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72  rom ORDER BY ter
114d0 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74  ms to result set
114e0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61   columns */..  a
114f0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
11500 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
11510 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
11520 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
11530 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
11540 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
11550 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
11560 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
11570 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
11580 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
11590 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
115a0 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
115b0 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
115c0 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
115d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
115e0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
115f0 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
11600 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11610 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
11620 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
11630 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
11640 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
11650 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
11660 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
11670 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
11680 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
11690 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
116a0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
116b0 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
116c0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
116d0 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
116e0 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
116f0 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
11700 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
11710 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
11720 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
11730 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
11740 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
11750 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
11760 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
11770 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
11780 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
11790 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
117a0 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
117b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
117c0 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
117d0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
117e0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
117f0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
11800 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
11810 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
11820 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
11830 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
11840 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
11850 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20  tem->iCol>0 );. 
11860 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
11870 2d 3e 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61  ->iCol==i ) brea
11880 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
11890 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79   if( j==nOrderBy
118a0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
118b0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
118c0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45  Expr(db, TK_INTE
118d0 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  GER, 0);.       
118e0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
118f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11900 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
11910 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
11920 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  tValue;.        
11930 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d  pNew->u.iValue =
11940 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64   i;.        pOrd
11950 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
11960 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
11970 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
11980 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  New);.        pO
11990 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72  rderBy->a[nOrder
119a0 42 79 2b 2b 5d 2e 69 43 6f 6c 20 3d 20 28 75 31  By++].iCol = (u1
119b0 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
119c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
119d0 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
119e0 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
119f0 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
11a00 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
11a10 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
11a20 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
11a30 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
11a40 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
11a50 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
11a60 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
11a70 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
11a80 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
11a90 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
11aa0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
11ab0 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
11ac0 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
11ad0 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
11ae0 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
11af0 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
11b00 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
11b10 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
11b20 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
11b30 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
11b40 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
11b50 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79  of(int)*nOrderBy
11b60 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
11b70 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
11b80 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
11b90 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Item;.    for(i=
11ba0 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
11bb0 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79  y->a; i<nOrderBy
11bc0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
11bd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11be0 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26 26  Item->iCol>0  &&
11bf0 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d   pItem->iCol<=p-
11c00 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
11c10 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
11c20 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43 6f  [i] = pItem->iCo
11c30 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  l - 1;.    }.   
11c40 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20   pKeyMerge =.   
11c50 20 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c     sqlite3DbMall
11c60 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
11c70 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72  (*pKeyMerge)+nOr
11c80 64 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f  derBy*(sizeof(Co
11c90 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20  llSeq*)+1));.   
11ca0 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29   if( pKeyMerge )
11cb0 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  {.      pKeyMerg
11cc0 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  e->aSortOrder = 
11cd0 28 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d  (u8*)&pKeyMerge-
11ce0 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d  >aColl[nOrderBy]
11cf0 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  ;.      pKeyMerg
11d00 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  e->nField = (u16
11d10 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  )nOrderBy;.     
11d20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20   pKeyMerge->enc 
11d30 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20  = ENC(db);.     
11d40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
11d50 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
11d60 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
11d70 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  ll;.        Expr
11d80 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72   *pTerm = pOrder
11d90 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
11da0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
11db0 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  m->flags & EP_Ex
11dc0 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
11dd0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54        pColl = pT
11de0 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  erm->pColl;.    
11df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11e00 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c       pColl = mul
11e10 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
11e20 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d  pParse, p, aPerm
11e30 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ute[i]);.       
11e40 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
11e50 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  |= EP_ExpCollate
11e60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  ;.          pTer
11e70 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  m->pColl = pColl
11e80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11e90 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61      pKeyMerge->a
11ea0 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
11eb0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72  .        pKeyMer
11ec0 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ge->aSortOrder[i
11ed0 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
11ee0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
11ef0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
11f00 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72  lse{.    pKeyMer
11f10 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ge = 0;.  }..  /
11f20 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f  * Reattach the O
11f30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
11f40 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  o the query..  *
11f50 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
11f60 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50  = pOrderBy;.  pP
11f70 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rior->pOrderBy =
11f80 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11f90 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
11fa0 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20  pOrderBy, 0);.. 
11fb0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72   /* Allocate a r
11fc0 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72  ange of temporar
11fd0 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  y registers and 
11fe0 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64  the KeyInfo need
11ff0 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ed.  ** for the 
12000 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76  logic that remov
12010 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73  es duplicate res
12020 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68  ult rows when th
12030 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20  e.  ** operator 
12040 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  is UNION, EXCEPT
12050 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28  , or INTERSECT (
12060 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c  but not UNION AL
12070 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  L)..  */.  if( o
12080 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
12090 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20   regPrev = 0;.  
120a0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
120b0 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
120c0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->nExpr;.    ass
120d0 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e  ert( nOrderBy>=n
120e0 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Expr || db->mall
120f0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
12100 72 65 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65  regPrev = sqlite
12110 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
12120 61 72 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a  arse, nExpr+1);.
12130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12140 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
12150 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
12160 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
12170 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
12180 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20  ero(db,.        
12190 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
121a0 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78  (*pKeyDup) + nEx
121b0 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  pr*(sizeof(CollS
121c0 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69  eq*)+1) );.    i
121d0 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20  f( pKeyDup ){.  
121e0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
121f0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
12200 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e  pKeyDup->aColl[n
12210 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65  Expr];.      pKe
12220 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28  yDup->nField = (
12230 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 20  u16)nExpr;.     
12240 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20   pKeyDup->enc = 
12250 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66  ENC(db);.      f
12260 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
12270 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
12280 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d  KeyDup->aColl[i]
12290 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
122a0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
122b0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65   i);.        pKe
122c0 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
122d0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
122e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f  .    }.  }. .  /
122f0 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c  * Separate the l
12300 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68  eft and the righ
12310 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65  t query from one
12320 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20   another.  */.  
12330 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
12340 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
12350 6f 73 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ost = 0;.  sqlit
12360 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
12370 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
12380 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
12390 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
123a0 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
123b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
123c0 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
123d0 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
123e0 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
123f0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
12400 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
12410 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
12420 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
12430 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
12440 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
12450 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
12460 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
12470 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
12480 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
12490 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
124a0 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
124b0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
124c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
124d0 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
124e0 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
124f0 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12520 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
12530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12540 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
12550 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
12560 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
12570 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
12580 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
12590 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
125a0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
125b0 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
125c0 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
125d0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
125e0 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
125f0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
12600 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
12610 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
12620 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65  gEofA = ++pParse
12630 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
12640 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
12650 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d  Mem;.  regEofB =
12660 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
12670 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
12680 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
12690 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
126a0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
126b0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
126c0 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
126d0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
126e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
126f0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
12700 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
12710 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
12720 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65  /* Jump past the
12730 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74   various subrout
12740 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69  ines and corouti
12750 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a  nes to the main.
12760 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a    ** merge loop.
12770 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69    */.  j1 = sqli
12780 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
12790 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64   OP_Goto);.  add
127a0 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
127b0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
127c0 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e  r(v);...  /* Gen
127d0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
127e0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
127f0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
12800 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
12810 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
12820 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
12830 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
12840 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
12850 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
12860 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
12870 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
12880 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
12890 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73  = regLimitA;.  s
128a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
128b0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
128c0 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
128d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
128e0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45  Integer, 1, regE
128f0 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
12900 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12910 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
12920 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
12930 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72  ent((v, "End cor
12940 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
12950 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a  SELECT"));..  /*
12960 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
12970 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
12980 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
12990 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20  tement on .  ** 
129a0 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20  the right - the 
129b0 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a  "B" select.  */.
129c0 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20    addrSelectB = 
129d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
129e0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62  ntAddr(v);.  Vdb
129f0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
12a00 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e   "Begin coroutin
12a10 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45  e for right SELE
12a20 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69  CT"));.  savedLi
12a30 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
12a40 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d  .  savedOffset =
12a50 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
12a60 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
12a70 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  mitB;.  p->iOffs
12a80 65 74 20 3d 20 30 3b 20 20 0a 20 20 73 71 6c 69  et = 0;  .  sqli
12a90 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
12aa0 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20  , p, &destB);.  
12ab0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65  p->iLimit = save
12ac0 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66  dLimit;.  p->iOf
12ad0 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73  fset = savedOffs
12ae0 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  et;.  sqlite3Vdb
12af0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12b00 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66  teger, 1, regEof
12b10 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
12b20 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
12b30 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
12b40 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12b50 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75  t((v, "End corou
12b60 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53  tine for right S
12b70 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20  ELECT"));..  /* 
12b80 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
12b90 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
12ba0 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
12bb0 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a  ow of the A.  **
12bc0 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
12bd0 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
12be0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
12bf0 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
12c00 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
12c10 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
12c20 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64  e for A"));.  ad
12c30 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74  drOutA = generat
12c40 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
12c50 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
12c60 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
12c70 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67  estA, pDest, reg
12c80 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20  OutA,.          
12c90 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
12ca0 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49  pKeyDup, P4_KEYI
12cb0 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62  NFO_HANDOFF, lab
12cc0 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
12cd0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
12ce0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
12cf0 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
12d00 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
12d10 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
12d20 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
12d30 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
12d40 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
12d50 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
12d60 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
12d70 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
12d80 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
12d90 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
12da0 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
12db0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
12dc0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
12dd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12de0 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
12df0 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
12e10 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
12e20 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54   P4_KEYINFO_STAT
12e30 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  IC, labelEnd);. 
12e40 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
12e50 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
12e60 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
12e70 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
12e80 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
12e90 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
12ea0 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
12eb0 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
12ec0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12ed0 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
12ee0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66  routine"));.  if
12ef0 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ( op==TK_EXCEPT 
12f00 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
12f10 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
12f20 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
12f30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12f40 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29  to, 0, labelEnd)
12f50 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
12f60 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
12f70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12f80 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
12f90 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
12fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12fb0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
12fc0 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
12fd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12fe0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
12ff0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b  ield, regAddrB);
13000 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13010 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
13020 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b  o, 0, addrEofA);
13030 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
13040 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
13050 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
13060 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
13070 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
13080 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
13090 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
130a0 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
130b0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
130c0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
130d0 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
130e0 6f 66 41 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  ofA;.  }else{  .
130f0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
13100 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
13110 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
13120 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
13130 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13140 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
13150 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
13160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13170 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
13180 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
13190 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
131a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
131b0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
131c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
131d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
131e0 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29  to, 0, addrEofB)
131f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
13200 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
13210 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
13220 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
13230 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
13240 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
13250 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
13260 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13270 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
13280 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
13290 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
132a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
132b0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
132c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
132d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
132e0 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
132f0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
13300 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13310 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
13320 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
13330 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
13340 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
13350 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
13360 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
13370 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
13380 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
13390 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
133a0 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
133b0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
133c0 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
133d0 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
133e0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
133f0 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
13400 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
13410 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
13420 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13430 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
13440 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13450 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
13460 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
13470 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ofA);.    sqlite
13480 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13490 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
134a0 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
134b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
134c0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
134d0 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
134e0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
134f0 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
13500 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
13510 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
13520 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
13530 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
13540 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
13550 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
13560 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13570 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
13580 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
13590 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
135a0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
135b0 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
135c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
135d0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
135e0 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
135f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13600 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
13610 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
13620 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
13630 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
13640 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
13650 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
13660 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13670 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   j1);.  sqlite3V
13680 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13690 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
136a0 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
136b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
136c0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
136d0 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
136e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
136f0 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c  Gosub, regAddrA,
13700 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
13710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13720 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
13730 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53 65  regAddrB, addrSe
13740 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65  lectB);.  sqlite
13750 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13760 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
13770 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
13780 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13790 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
137a0 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f   addrEofB);..  /
137b0 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
137c0 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
137d0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
137e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
137f0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
13800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13810 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
13820 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
13830 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
13840 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
13850 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13860 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
13870 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74  destA.iMem, dest
13880 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72 42 79  B.iMem, nOrderBy
13890 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
138a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
138b0 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
138c0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
138d0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
138e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
138f0 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
13900 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
13910 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
13920 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
13930 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  rs.  */.  if( re
13940 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73 71 6c  gPrev ){.    sql
13950 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13960 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
13970 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31  Prev, nOrderBy+1
13980 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
13990 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f  p to the this po
139a0 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
139b0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75  terminate the qu
139c0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ery..  */.  sqli
139d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
139e0 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29  bel(v, labelEnd)
139f0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
13a00 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
13a10 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
13a20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
13a30 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
13a40 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
13a50 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  st = pPrior;.   
13a60 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
13a70 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
13a80 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
13a90 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  ;.    generateCo
13aa0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
13ab0 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
13ac0 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
13ad0 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63  Reassembly the c
13ae0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f  ompound query so
13af0 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
13b00 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79   freed correctly
13b10 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  .  ** by the cal
13b20 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
13b30 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
13b40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
13b50 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
13b60 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a  p->pPrior);.  }.
13b70 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
13b80 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42  rior;..  /*** TB
13b90 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
13ba0 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
13bb0 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
13bc0 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
13bd0 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
13be0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
13bf0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
13c00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
13c10 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
13c20 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
13c30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13c40 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  )./* Forward Dec
13c50 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
13c60 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
13c70 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
13c80 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
13c90 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
13ca0 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
13cb0 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
13cc0 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
13cd0 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a  prList *);../*.*
13ce0 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
13cf0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
13d00 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
13d10 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
13d20 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
13d30 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
13d40 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
13d50 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
13d60 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
13d70 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
13d80 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
13d90 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
13da0 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
13db0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13dc0 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
13dd0 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
13de0 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
13df0 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
13e00 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
13e10 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
13e20 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
13e30 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
13e40 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
13e50 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
13e60 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
13e70 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
13e80 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
13e90 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
13ea0 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
13eb0 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
13ec0 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
13ed0 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
13ee0 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
13ef0 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
13f00 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
13f10 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
13f20 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
13f30 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
13f40 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74  atic Expr *subst
13f50 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
13f60 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52  *db,        /* R
13f70 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
13f80 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e  ors to this conn
13f90 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
13fa0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
13fb0 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
13fc0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
13fd0 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  curs */.  int iT
13fe0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  able,         /*
13ff0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
14000 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
14010 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
14020 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
14030 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29  expressions */.)
14040 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
14050 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
14060 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
14070 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
14080 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
14090 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
140a0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
140b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
140c0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
140d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
140e0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73   *pNew;.      as
140f0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
14100 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
14110 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
14120 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14130 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
14140 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
14150 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
14160 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
14170 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
14180 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
14190 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
141a0 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 70     if( pNew && p
141b0 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20  Expr->pColl ){. 
141c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f         pNew->pCo
141d0 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c  ll = pExpr->pCol
141e0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
141f0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
14200 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
14210 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
14220 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  w;.    }.  }else
14230 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  {.    pExpr->pLe
14240 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ft = substExpr(d
14250 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
14260 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
14270 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
14280 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  ght = substExpr(
14290 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
142a0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
142b0 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
142c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
142d0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
142e0 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
142f0 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d  elect(db, pExpr-
14300 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  >x.pSelect, iTab
14310 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
14320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
14330 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
14340 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
14350 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
14360 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14370 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61  urn pExpr;.}.sta
14380 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
14390 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
143a0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
143b0 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
143c0 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
143d0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
143e0 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
143f0 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
14400 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
14410 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
14420 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
14430 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
14440 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
14450 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
14460 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
14470 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
14480 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
14490 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
144a0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
144b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
144c0 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
144d0 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
144e0 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d  tExpr(db, pList-
144f0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
14500 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14510 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
14520 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73  substSelect(.  s
14530 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
14540 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
14550 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
14560 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
14570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
14580 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
14590 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
145a0 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
145b0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
145c0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
145d0 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
145e0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
145f0 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
14600 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
14610 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
14620 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
14630 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
14640 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
14650 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
14660 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
14670 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  db, p->pEList, i
14680 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14690 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
146a0 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
146b0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
146c0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
146d0 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  t(db, p->pOrderB
146e0 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
146f0 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67  t);.  p->pHaving
14700 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
14710 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
14720 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14730 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
14740 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68  tExpr(db, p->pWh
14750 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
14760 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c  ist);.  substSel
14770 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ect(db, p->pPrio
14780 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
14790 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  t);.  pSrc = p->
147a0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
147b0 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e  pSrc );  /* Even
147c0 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20   for (SELECT 1) 
147d0 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30  we have: pSrc!=0
147e0 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d   but pSrc->nSrc=
147f0 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  =0 */.  if( ALWA
14800 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20  YS(pSrc) ){.    
14810 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
14820 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
14830 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
14840 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
14850 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d  Select(db, pItem
14860 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
14870 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
14880 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
14890 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
148a0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
148b0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
148c0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
148d0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
148e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
148f0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
14900 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
14910 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EW)./*.** This r
14920 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
14930 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
14940 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74  eries in order t
14950 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75  o speed.** execu
14960 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e  tion.  It return
14970 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
14980 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
14990 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a   no flattening.*
149a0 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  * occurs..**.** 
149b0 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
149c0 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
149d0 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
149e0 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
149f0 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
14a00 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
14a10 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
14a20 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
14a30 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
14a40 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
14a50 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
14a60 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
14a70 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
14a80 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
14a90 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
14aa0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
14ab0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
14ac0 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
14ad0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
14ae0 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
14af0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
14b00 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
14b10 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
14b20 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
14b30 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
14b40 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
14b50 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
14b60 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
14b70 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
14b80 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
14b90 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
14ba0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14bb0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
14bc0 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
14bd0 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
14be0 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
14bf0 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
14c00 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
14c10 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
14c20 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
14c30 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
14c40 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
14c50 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
14c60 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76  impification giv
14c70 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
14c80 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
14c90 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
14ca0 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
14cb0 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
14cc0 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
14cd0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
14ce0 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
14cf0 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
14d00 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
14d10 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
14d20 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
14d30 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
14d40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
14d50 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
14d60 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14d70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
14d80 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
14d90 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
14da0 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
14db0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
14dc0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
14dd0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14de0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
14df0 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
14e00 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
14e10 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
14e20 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
14e30 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20  er join.**      
14e40 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69    (Originally ti
14e50 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65  cket #306.  Stre
14e60 6e 67 68 74 65 6e 65 64 20 62 79 20 74 69 63 6b  nghtened by tick
14e70 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20  et #3300).**.** 
14e80 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75    (4)  The subqu
14e90 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
14ea0 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
14eb0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
14ec0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35  join..**.**   (5
14ed0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14ee0 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20  is not DISTINCT 
14ef0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
14f00 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
14f10 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
14f20 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ates..**.**   (6
14f30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14f40 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
14f50 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
14f60 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
14f70 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
14f80 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
14f90 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14fa0 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  has a FROM claus
14fb0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  e..**.**   (8)  
14fc0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
14fd0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
14fe0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
14ff0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
15000 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
15010 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
15020 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
15030 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
15040 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
15050 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
15060 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29  tes..**.**  (10)
15070 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
15080 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
15090 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
150a0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
150b0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65  ot.**        use
150c0 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
150d0 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
150e0 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
150f0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
15100 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
15110 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
15120 28 31 32 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (12)  Not implem
15130 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
15140 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
15150 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
15160 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
15170 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
15180 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
15190 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
151a0 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
151b0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
151c0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
151d0 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
151e0 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  IT.**.**  (14)  
151f0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
15200 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  s not use OFFSET
15210 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68  .**.**  (15)  Th
15220 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
15230 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63   not part of a c
15240 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f  ompound select o
15250 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
15260 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
15270 74 20 68 61 76 65 20 62 6f 74 68 20 61 6e 20 4f  t have both an O
15280 52 44 45 52 20 42 59 20 61 6e 64 20 61 20 4c 49  RDER BY and a LI
15290 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20  MIT clause..**  
152a0 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
152b0 74 20 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 20  t #2339).**.**  
152c0 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20  (16)  The outer 
152d0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
152e0 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
152f0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a   subquery does.*
15300 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e  *        not con
15310 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20  tain ORDER BY.  
15320 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20  (Ticket #2942)  
15330 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74  This used to not
15340 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20   matter.**      
15350 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f    until we intro
15360 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f  duced the group_
15370 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f  concat() functio
15380 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29  n.  .**.**  (17)
15390 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20    The sub-query 
153a0 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  is not a compoun
153b0 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20  d select, or it 
153c0 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a  is a UNION ALL .
153d0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
153e0 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75  nd clause made u
153f0 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f  p entirely of no
15400 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
15410 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20  ies, and .**    
15420 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71      the parent q
15430 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
15440 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74       * is not it
15450 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63  self part of a c
15460 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a  ompound select,.
15470 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
15480 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
15490 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75  e or DISTINCT qu
154a0 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ery, and.**     
154b0 20 20 20 20 20 2a 20 68 61 73 20 6e 6f 20 6f 74       * has no ot
154c0 68 65 72 20 74 61 62 6c 65 73 20 6f 72 20 73 75  her tables or su
154d0 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 74 68 65  b-selects in the
154e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
154f0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70  .**        The p
15500 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75  arent and sub-qu
15510 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ery may contain 
15520 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53  WHERE clauses. S
15530 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20  ubject to.**    
15540 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20      rules (11), 
15550 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74  (13) and (14), t
15560 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e  hey may also con
15570 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a  tain ORDER BY,.*
15580 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61  *        LIMIT a
15590 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
155a0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20  s..**.**  (18)  
155b0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
155c0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
155d0 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20  elect, then all 
155e0 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
155f0 20 20 20 20 20 20 20 4f 52 44 45 52 20 62 79 20         ORDER by 
15600 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70 61  clause of the pa
15610 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d  rent must be sim
15620 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ple references t
15630 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c  o .**        col
15640 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d  umns of the sub-
15650 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  query..**.**  (1
15660 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
15670 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
15680 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
15690 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
156a0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61  **        have a
156b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
156c0 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74  *.**  (20)  If t
156d0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
156e0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
156f0 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  t, then it must 
15700 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
15710 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c    an ORDER BY cl
15720 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33  ause.  Ticket #3
15730 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72  773.  We could r
15740 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72  elax this constr
15750 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73  aint.**        s
15760 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e  omewhat by sayin
15770 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73  g that the terms
15780 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
15790 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20   clause must.** 
157a0 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73         appear as
157b0 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75   unmodified resu
157c0 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  lt columns in th
157d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
157e0 42 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  But.**        ha
157f0 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  ve other optimiz
15800 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74  ations in mind t
15810 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74  o deal with that
15820 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
15830 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
15840 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
15850 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
15860 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
15870 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
15880 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
15890 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
158a0 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
158b0 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
158c0 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20   aggregates and 
158d0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73  subqueryIsAgg is
158e0 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62   true if the sub
158f0 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
15900 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
15910 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
15920 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
15930 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
15940 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
15950 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
15960 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
15970 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
15980 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
15990 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
159a0 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
159b0 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
159c0 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
159d0 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
159e0 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
159f0 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
15a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
15a10 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
15a20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15a30 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
15a40 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
15a50 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
15a60 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
15a70 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
15a80 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
15a90 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
15aa0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
15ab0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
15ac0 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
15ad0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
15ae0 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
15af0 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
15b00 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
15b10 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
15b20 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
15b30 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
15b40 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
15b50 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
15b60 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
15b70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
15b80 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
15b90 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
15ba0 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
15bb0 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c   *pParent;.  Sel
15bc0 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
15bd0 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
15be0 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
15bf0 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  " */.  Select *p
15c00 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f  Sub1;      /* Po
15c10 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67  inter to the rig
15c20 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e  htmost select in
15c30 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20   sub-query */.  
15c40 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
15c50 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
15c60 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
15c70 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
15c80 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
15c90 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
15ca0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
15cb0 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
15cc0 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
15cd0 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
15ce0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
15cf0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
15d00 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
15d10 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
15d20 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
15d30 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
15d40 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d60 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
15d70 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
15da0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
15db0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
15dc0 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a   *pSubitem;   /*
15dd0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   The subquery */
15de0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
15df0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
15e00 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
15e10 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  if flattening is
15e20 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74   permitted.  Ret
15e30 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20  urn 0 if not..  
15e40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  */.  assert( p!=
15e50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
15e60 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20  ->pPrior==0 );  
15e70 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61  /* Unable to fla
15e80 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75  tten compound qu
15e90 65 72 69 65 73 20 2a 2f 0a 20 20 70 53 72 63 20  eries */.  pSrc 
15ea0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
15eb0 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
15ec0 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
15ed0 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
15ee0 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
15ef0 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61  >a[iFrom];.  iPa
15f00 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
15f10 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62  >iCursor;.  pSub
15f20 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
15f30 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
15f40 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
15f50 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65   isAgg && subque
15f60 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
15f70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
15f80 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
15f90 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28  on (1)  */.  if(
15fa0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26   subqueryIsAgg &
15fb0 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  & pSrc->nSrc>1 )
15fc0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
15fd0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
15fe0 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75  on (2)  */.  pSu
15ff0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
16000 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
16010 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69  bSrc );.  /* Pri
16020 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e  or to version 3.
16030 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20  1.2, when LIMIT 
16040 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74  and OFFSET had t
16050 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73  o be simple cons
16060 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  tants,.  ** not 
16070 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
16080 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
16090 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
160a0 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
160b0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
160c0 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
160d0 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
160e0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
160f0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
16100 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
16110 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
16120 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
16130 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
16140 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
16150 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
16160 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
16170 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
16180 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
16190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
161a0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
161b0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
161c0 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
161d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
161e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
161f0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
16200 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67  */.  if( p->pRig
16210 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e  htmost && pSub->
16220 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e  pLimit && pSub->
16230 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
16240 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16270 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
16280 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
16290 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
162a0 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
162b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
162c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
162d0 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
162e0 20 20 69 66 28 20 28 28 70 53 75 62 2d 3e 73 65    if( ((pSub->se
162f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
16300 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 75 62  inct)!=0 || pSub
16310 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20  ->pLimit) .     
16320 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53      && (pSrc->nS
16330 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
16340 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  {          /* Re
16350 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35  strictions (4)(5
16360 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20  )(8)(9) */.     
16370 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
16380 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
16390 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
163a0 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62  tinct)!=0 && sub
163b0 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
163c0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
163d0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
163e0 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a  ion (6)  */.  }.
163f0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
16400 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
16410 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
16420 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16450 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
16460 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
16470 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
16480 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
16490 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
164a0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
164b0 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
164c0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
164d0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
164e0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
164f0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
16500 6f 6e 20 28 31 39 29 20 2a 2f 0a 0a 20 20 2f 2a  on (19) */..  /*
16510 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
16520 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 1:.  ** Restri
16530 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
16540 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
16550 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
16560 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
16570 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
16580 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
16590 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
165a0 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
165b0 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
165c0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
165d0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
165e0 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
165f0 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
16600 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
16610 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
16620 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
16630 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
16640 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
16650 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
16660 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
16670 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
16680 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
16690 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f  ..  **.  ** OBSO
166a0 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a  LETE COMMENT 2:.
166b0 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
166c0 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
166d0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
166e0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
166f0 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
16700 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
16710 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
16720 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
16730 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
16740 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
16750 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
16760 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
16770 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
16780 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
16790 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
167a0 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
167b0 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
167c0 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
167d0 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
167e0 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
167f0 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
16800 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
16810 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
16820 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
16830 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
16840 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
16850 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
16860 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
16870 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
16880 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
16890 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53  ..  **.  ** THIS
168a0 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c   OVERRIDES OBSOL
168b0 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41  ETE COMMENTS 1 A
168c0 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a  ND 2 ABOVE:.  **
168d0 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68   Ticket #3300 sh
168e0 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ows that flatten
168f0 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65  ing the right te
16900 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
16910 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68  N.  ** is fraugh
16920 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20  t with danger.  
16930 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  Best to avoid th
16940 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20  e whole thing.  
16950 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  If the.  ** subq
16960 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
16970 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
16980 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e   JOIN, then do n
16990 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f  ot flatten..  */
169a0 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
169b0 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
169c0 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
169d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
169e0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
169f0 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d   17: If the sub-
16a00 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
16a10 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  und SELECT, then
16a20 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73   it must.  ** us
16a30 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e  e only the UNION
16a40 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41   ALL operator. A
16a50 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  nd none of the s
16a60 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65  imple select que
16a70 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d  ries.  ** that m
16a80 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f  ake up the compo
16a90 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61  und SELECT are a
16aa0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67  llowed to be agg
16ab0 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e  regate or distin
16ac0 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ct.  ** queries.
16ad0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
16ae0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
16af0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
16b00 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  By ){.      retu
16b10 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69  rn 0;  /* Restri
16b20 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20  ction 20 */.    
16b30 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
16b40 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
16b50 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
16b60 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
16b70 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
16b80 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
16b90 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
16ba0 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
16bb0 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
16bc0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
16bd0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
16be0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
16bf0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
16c00 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
16c10 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
16c20 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
16c30 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
16c40 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
16c50 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
16c60 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
16c70 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
16c80 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
16c90 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c  te))!=0.       |
16ca0 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  | (pSub1->pPrior
16cb0 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54   && pSub1->op!=T
16cc0 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c  K_ALL) .       |
16cd0 7c 20 4e 45 56 45 52 28 70 53 75 62 31 2d 3e 70  | NEVER(pSub1->p
16ce0 53 72 63 3d 3d 30 29 20 7c 7c 20 70 53 75 62 31  Src==0) || pSub1
16cf0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a  ->pSrc->nSrc!=1.
16d00 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16d10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
16d20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
16d30 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e   Restriction 18.
16d40 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
16d50 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
16d60 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
16d70 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
16d80 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
16d90 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
16da0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
16db0 61 5b 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20  a[ii].iCol==0 ) 
16dc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
16dd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
16de0 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63  ***** If we reac
16df0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c  h this point, fl
16e00 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
16e10 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20  itted. *****/.. 
16e20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68   /* Authorize th
16e30 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
16e40 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
16e50 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  text = pSubitem-
16e60 3e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  >zName;.  sqlite
16e70 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
16e80 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
16e90 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50  , 0, 0, 0);.  pP
16ea0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
16eb0 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
16ec0 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
16ed0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
16ee0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
16ef0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
16f00 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
16f10 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
16f20 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
16f30 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
16f40 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
16f50 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
16f60 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
16f70 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
16f80 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
16f90 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
16fa0 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
16fb0 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
16fc0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
16fd0 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
16fe0 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
16ff0 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
17000 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
17010 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
17020 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
17030 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
17040 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
17050 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
17060 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
17070 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
17080 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
17090 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
170a0 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
170b0 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
170c0 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
170d0 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
170e0 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
170f0 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
17100 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
17110 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
17120 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
17130 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
17140 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
17150 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
17160 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
17170 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
17180 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
17190 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
171a0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
171b0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
171c0 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
171d0 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
171e0 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
171f0 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
17200 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
17210 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
17220 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
17230 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
17240 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
17250 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
17260 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
17270 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
17280 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
17290 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
172a0 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
172b0 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
172c0 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
172d0 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
172e0 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
172f0 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
17300 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
17310 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
17320 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
17330 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
17340 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
17350 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
17360 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
17370 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
17380 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
17390 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
173a0 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
173b0 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
173c0 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
173d0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
173e0 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
173f0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
17400 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
17410 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
17420 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
17430 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69  , 0);.    p->pLi
17440 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
17450 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
17460 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
17470 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
17480 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c    p->op = TK_ALL
17490 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d  ;.    p->pRightm
174a0 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ost = 0;.    if(
174b0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
174c0 20 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b    pNew = pPrior;
174d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
174e0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
174f0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
17500 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  New->pRightmost 
17510 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
17520 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
17530 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
17540 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
17550 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
17560 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67  Begin flattening
17570 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e   the iFrom-th en
17580 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
17590 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20  clause .  ** in 
175a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
175b0 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  .  */.  pSub = p
175c0 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d  Sub1 = pSubitem-
175d0 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
175e0 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73  Delete the trans
175f0 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
17600 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20  ture associated 
17610 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
17620 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71  bquery.  */.  sq
17630 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17640 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
17650 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ase);.  sqlite3D
17660 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
17670 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  em->zName);.  sq
17680 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17690 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
176a0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  );.  pSubitem->z
176b0 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
176c0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pSubitem->zName 
176d0 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
176e0 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70  >zAlias = 0;.  p
176f0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
17700 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65   = 0;..  /* Defe
17710 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54  r deleting the T
17720 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f  able object asso
17730 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
17740 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e    ** subquery un
17750 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
17760 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70  ion is.  ** comp
17770 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72  lete, since ther
17780 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73  e may still exis
17790 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72  t Expr.pTab entr
177a0 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  ies that.  ** re
177b0 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75  fer to the subqu
177c0 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66  ery even after f
177d0 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b  lattening.  Tick
177e0 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20  et #3346..  **. 
177f0 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54   ** pSubitem->pT
17800 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e  ab is always non
17810 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65  -NULL by test re
17820 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74  strictions and t
17830 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f  ests above..  */
17840 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53  .  if( ALWAYS(pS
17850 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29  ubitem->pTab!=0)
17860 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
17870 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69  TabToDel = pSubi
17880 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
17890 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52  f( pTabToDel->nR
178a0 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50  ef==1 ){.      P
178b0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
178c0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
178d0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
178e0 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
178f0 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70  >pNextZombie = p
17900 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69  Toplevel->pZombi
17910 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70  eTab;.      pTop
17920 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
17930 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20  b = pTabToDel;. 
17940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17950 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d  pTabToDel->nRef-
17960 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  -;.    }.    pSu
17970 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
17980 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
17990 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
179a0 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
179b0 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f   term in a compo
179c0 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a  und-subquery.  *
179d0 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73  * flattening (as
179e0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
179f0 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f  ).  If we are do
17a00 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20  ing a different 
17a10 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61  kind.  ** of fla
17a20 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74  ttening - a flat
17a30 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61  tening other tha
17a40 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
17a50 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
17a60 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69   -.  ** then thi
17a70 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73  s loop only runs
17a80 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   once..  **.  **
17a90 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73   This loop moves
17aa0 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
17ab0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
17ac0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
17ad0 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  he.  ** the FROM
17ae0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
17af0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66  uter query.  Bef
17b00 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20  ore doing this, 
17b10 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
17b20 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
17b30 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  for the original
17b40 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
17b50 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a  M element in.  *
17b60 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20  * iParent.  The 
17b70 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77  iParent cursor w
17b80 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
17b90 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  d.  Subsequent c
17ba0 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63  ode.  ** will sc
17bb0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  an expressions l
17bc0 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65  ooking for iPare
17bd0 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  nt references an
17be0 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74  d replace.  ** t
17bf0 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20  hose references 
17c00 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73  with expressions
17c10 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f   that resolve to
17c20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52   the subquery FR
17c30 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73  OM.  ** elements
17c40 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79   we are now copy
17c50 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ing in..  */.  f
17c60 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50  or(pParent=p; pP
17c70 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70  arent; pParent=p
17c80 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20  Parent->pPrior, 
17c90 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
17ca0 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62  r){.    int nSub
17cb0 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e  Src;.    u8 join
17cc0 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  type = 0;.    pS
17cd0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
17ce0 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
17cf0 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
17d00 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72  ry */.    nSubSr
17d10 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
17d20 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;  /* Number of
17d30 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65   terms in subque
17d40 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  ry FROM clause *
17d50 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61  /.    pSrc = pPa
17d60 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20  rent->pSrc;     
17d70 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
17d80 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
17d90 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53  y */..    if( pS
17da0 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rc ){.      asse
17db0 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29  rt( pParent==p )
17dc0 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65  ;  /* First time
17dd0 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
17de0 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74  p */.      joint
17df0 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
17e00 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65  jointype;.    }e
17e10 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
17e20 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b  t( pParent!=p );
17e30 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62    /* 2nd and sub
17e40 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68  sequent times th
17e50 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
17e60 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  /.      pSrc = p
17e70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73  Parent->pSrc = s
17e80 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
17e90 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29  end(db, 0, 0, 0)
17ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
17eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
17ec0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
17ed0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
17ee0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17ef0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
17f00 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  The subquery use
17f10 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20  s a single slot 
17f20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
17f30 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a  se of the outer.
17f40 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49      ** query.  I
17f50 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  f the subquery h
17f60 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
17f70 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20   element in its 
17f80 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20  FROM clause,.   
17f90 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20   ** then expand 
17fa0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17fb0 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
17fc0 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  r it to hold all
17fd0 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a   elements.    **
17fe0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
17ff0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
18000 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
18010 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54      **    SELECT
18020 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53   * FROM tabA, (S
18030 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62  ELECT * FROM sub
18040 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a  1, sub2), tabB;.
18050 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
18060 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
18070 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73  s 3 slots in its
18080 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f   FROM clause.  O
18090 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20  ne slot of the. 
180a0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
180b0 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c  y (the middle sl
180c0 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74  ot) is used by t
180d0 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
180e0 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
180f0 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c  ock of code will
18100 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20   expand the out 
18110 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73  query to 4 slots
18120 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20  .  The middle.  
18130 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70    ** slot is exp
18140 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f  anded to two slo
18150 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ts in order to m
18160 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ake space for th
18170 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65  e.    ** two ele
18180 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f  ments in the FRO
18190 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
181a0 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  subquery..    */
181b0 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
181c0 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  >1 ){.      pPar
181d0 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  ent->pSrc = pSrc
181e0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
181f0 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
18200 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72  c, nSubSrc-1,iFr
18210 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  om+1);.      if(
18220 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18230 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
18240 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
18250 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66  }..    /* Transf
18260 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  er the FROM clau
18270 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  se terms from th
18280 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
18290 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
182a0 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20   query..    */. 
182b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
182c0 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
182d0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
182e0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d  Delete(db, pSrc-
182f0 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69  >a[i+iFrom].pUsi
18300 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  ng);.      pSrc-
18310 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
18320 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
18330 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
18340 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
18350 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
18360 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
18370 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f  Src->a[iFrom].jo
18380 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
18390 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
183a0 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
183b0 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
183c0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
183d0 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
183e0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
183f0 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
18400 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
18410 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
18420 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
18430 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
18440 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
18450 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
18460 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
18470 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
18480 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
18490 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
184a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
184b0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
184c0 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
184d0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
184e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
184f0 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
18500 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18510 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
18520 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
18530 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
18540 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
18550 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
18560 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
18570 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
18580 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
18590 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
185a0 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
185b0 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
185c0 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50  /.    pList = pP
185d0 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  arent->pEList;. 
185e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
185f0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
18600 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  {.      if( pLis
18610 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
18620 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
18630 74 20 63 68 61 72 20 2a 7a 53 70 61 6e 20 3d 20  t char *zSpan = 
18640 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  pList->a[i].zSpa
18650 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 41  n;.        if( A
18660 4c 57 41 59 53 28 7a 53 70 61 6e 29 20 29 7b 0a  LWAYS(zSpan) ){.
18670 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d            pList-
18680 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
18690 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
186a0 2c 20 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  , zSpan);.      
186b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
186c0 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  }.    substExprL
186d0 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
186e0 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74  >pEList, iParent
186f0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
18700 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
18710 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
18720 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
18730 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61  t->pGroupBy, iPa
18740 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
18750 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
18760 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75  nt->pHaving = su
18770 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
18780 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
18790 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
187a0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
187b0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
187c0 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  By ){.      asse
187d0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  rt( pParent->pOr
187e0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
187f0 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65    pParent->pOrde
18800 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
18810 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62  erBy;.      pSub
18820 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
18830 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
18840 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
18850 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
18860 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
18870 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50  nt->pOrderBy, iP
18880 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
18890 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
188a0 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
188b0 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65   ){.      pWhere
188c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
188d0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
188e0 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  re, 0);.    }els
188f0 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20  e{.      pWhere 
18900 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
18910 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
18920 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
18930 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  ( pParent->pHavi
18940 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ng==0 );.      p
18950 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
18960 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  = pParent->pWher
18970 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e;.      pParent
18980 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
18990 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e;.      pParent
189a0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
189b0 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
189c0 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
189d0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
189e0 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
189f0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  t->pHaving = sql
18a00 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
18a10 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
18a20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
18a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18a50 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48  Dup(db, pSub->pH
18a60 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20  aving, 0));.    
18a70 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
18a80 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  t->pGroupBy==0 )
18a90 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
18aa0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
18ab0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
18ac0 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  b, pSub->pGroupB
18ad0 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  y, 0);.    }else
18ae0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
18af0 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
18b00 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
18b10 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74  >pWhere, iParent
18b20 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
18b30 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
18b40 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
18b50 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
18b60 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68  ent->pWhere, pWh
18b70 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ere);.    }.  . 
18b80 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65     /* The flatte
18b90 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
18ba0 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
18bb0 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
18bc0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
18bd0 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
18be0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61   .    */.    pPa
18bf0 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
18c00 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
18c10 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a   & SF_Distinct;.
18c20 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
18c30 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
18c40 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
18c50 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
18c60 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
18c70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
18c80 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
18c90 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
18ca0 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
18cb0 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
18cc0 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
18cd0 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
18ce0 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
18cf0 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
18d00 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
18d10 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
18d20 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
18d30 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
18d40 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
18d50 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
18d60 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
18d70 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
18d80 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
18d90 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
18da0 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
18db0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
18dc0 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29  elete(db, pSub1)
18dd0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  ;..  return 1;.}
18de0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
18df0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
18e00 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
18e10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
18e20 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a  T_VIEW) */../*.*
18e30 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45  * Analyze the SE
18e40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
18e50 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
18e60 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69  ment to see if i
18e70 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29 20  t.** is a min() 
18e80 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
18e90 52 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  Return WHERE_ORD
18ea0 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52  ERBY_MIN or WHER
18eb0 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 69 66  E_ORDERBY_MAX if
18ec0 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20 30   .** it is, or 0
18ed0 20 6f 74 68 65 72 77 69 73 65 2e 20 41 74 20 70   otherwise. At p
18ee0 72 65 73 65 6e 74 2c 20 61 20 71 75 65 72 79 20  resent, a query 
18ef0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
18f00 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d   be.** a min()/m
18f10 61 78 28 29 20 71 75 65 72 79 20 69 66 3a 0a 2a  ax() query if:.*
18f20 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65 72 65 20  *.**   1. There 
18f30 69 73 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a 65  is a single obje
18f40 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ct in the FROM c
18f50 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  lause..**.**   2
18f60 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69 6e  . There is a sin
18f70 67 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  gle expression i
18f80 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
18f90 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20  , and it is.**  
18fa0 20 20 20 20 65 69 74 68 65 72 20 6d 69 6e 28 78      either min(x
18fb0 29 20 6f 72 20 6d 61 78 28 78 29 2c 20 77 68 65  ) or max(x), whe
18fc0 72 65 20 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re x is a column
18fd0 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73   reference..*/.s
18fe0 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51  tatic u8 minMaxQ
18ff0 75 65 72 79 28 53 65 6c 65 63 74 20 2a 70 29 7b  uery(Select *p){
19000 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
19010 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
19020 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
19030 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
19040 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
19050 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
19060 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d  ORMAL;.  pExpr =
19070 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
19080 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
19090 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
190a0 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
190b0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 45 78  ;.  if( NEVER(Ex
190c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
190d0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
190e0 74 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  t)) ) return 0;.
190f0 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
19100 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28  ->x.pList;.  if(
19110 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45   pEList==0 || pE
19120 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
19130 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
19140 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
19150 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
19160 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
19170 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
19180 52 4d 41 4c 3b 0a 20 20 61 73 73 65 72 74 28 20  RMAL;.  assert( 
19190 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
191a0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
191b0 6c 75 65 29 20 29 3b 0a 20 20 69 66 28 20 73 71  lue) );.  if( sq
191c0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78  lite3StrICmp(pEx
191d0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 69  pr->u.zToken,"mi
191e0 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  n")==0 ){.    re
191f0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
19200 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65 20  BY_MIN;.  }else 
19210 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
19220 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
19230 65 6e 2c 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a  en,"max")==0 ){.
19240 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45      return WHERE
19250 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
19260 7d 0a 20 20 72 65 74 75 72 6e 20 57 48 45 52 45  }.  return WHERE
19270 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
19280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
19290 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
192a0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
192b0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
192c0 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
192d0 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  y..** The second
192e0 20 61 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20   argment is the 
192f0 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65  associated aggre
19300 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74  gate-info object
19310 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
19320 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65  ion tests if the
19330 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68   SELECT is of th
19340 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
19350 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
19360 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a  FROM <tbl>.**.**
19370 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20   where table is 
19380 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
19390 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65  , not a sub-sele
193a0 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74  ct or view. If t
193b0 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73  he query.** does
193c0 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74   match this patt
193d0 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ern, then a poin
193e0 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ter to the Table
193f0 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
19400 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73  ting.** <tbl> is
19410 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
19420 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
19430 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  ned..*/.static T
19440 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f  able *isSimpleCo
19450 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41  unt(Select *p, A
19460 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
19470 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
19480 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  ;.  Expr *pExpr;
19490 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e  ..  assert( !p->
194a0 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69  pGroupBy );..  i
194b0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20  f( p->pWhere || 
194c0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
194d0 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53  !=1 .   || p->pS
194e0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70  rc->nSrc!=1 || p
194f0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
19500 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65  lect.  ){.    re
19510 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
19520 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
19530 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72  0].pTab;.  pExpr
19540 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
19550 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  0].pExpr;.  asse
19560 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61  rt( pTab && !pTa
19570 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45  b->pSelect && pE
19580 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73  xpr );..  if( Is
19590 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
195a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
195b0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
195c0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
195d0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
195e0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
195f0 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 26 53 51  .pFunc->flags&SQ
19600 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29  LITE_FUNC_COUNT)
19610 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
19620 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
19630 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29  gs&EP_Distinct )
19640 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65   return 0;..  re
19650 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
19660 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63  .** If the sourc
19670 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73  e-list item pass
19680 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
19690 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20  t was augmented 
196a0 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58  with an.** INDEX
196b0 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
196c0 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65  en try to locate
196d0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69   the specified i
196e0 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a  ndex. If there.*
196f0 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61  * was such a cla
19700 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  use and the name
19710 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62  d index cannot b
19720 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
19730 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
19740 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72   and leave an er
19750 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f  ror in pParse. O
19760 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61  therwise, popula
19770 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49  te .** pFrom->pI
19780 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20  ndex and return 
19790 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
197a0 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  t sqlite3Indexed
197b0 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a  ByLookup(Parse *
197c0 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
197d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
197e0 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
197f0 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d  ->pTab && pFrom-
19800 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54  >zIndex ){.    T
19810 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
19820 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
19830 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72  ar *zIndex = pFr
19840 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20  om->zIndex;.    
19850 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
19860 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
19870 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20  pIndex; .       
19880 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33   pIdx && sqlite3
19890 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e  StrICmp(pIdx->zN
198a0 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20  ame, zIndex); . 
198b0 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78         pIdx=pIdx
198c0 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20  ->pNext.    );. 
198d0 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a     if( !pIdx ){.
198e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
198f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
19900 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73  o such index: %s
19910 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20  ", zIndex, 0);. 
19920 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19930 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
19940 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65      pFrom->pInde
19950 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20  x = pIdx;.  }.  
19960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19980 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c  routine is a Wal
19990 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ker callback for
199a0 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53   "expanding" a S
199b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
199c0 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20  .** "Expanding" 
199d0 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20  means to do the 
199e0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
199f0 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
19a00 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
19a10 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
19a20 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
19a30 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
19a40 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
19a50 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
19a60 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
19a70 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
19a80 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
19a90 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
19aa0 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
19ab0 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
19ac0 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
19ad0 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
19ae0 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
19af0 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
19b00 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
19b10 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
19b20 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
19b30 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
19b40 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
19b50 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
19b60 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
19b70 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
19b80 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
19b90 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
19ba0 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
19bb0 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
19bc0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
19bd0 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
19be0 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
19bf0 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
19c00 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
19c10 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
19c20 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
19c30 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
19c40 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
19c50 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
19c60 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
19c70 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
19c80 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
19c90 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
19ca0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
19cb0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
19cc0 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
19cd0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
19ce0 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
19cf0 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
19d00 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
19d10 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
19d20 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
19d30 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
19d40 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
19d50 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
19d60 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
19d70 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
19d80 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
19d90 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
19da0 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
19db0 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
19dc0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
19dd0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
19de0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
19df0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
19e00 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
19e10 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
19e20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
19e30 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
19e40 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
19e50 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
19e60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
19e70 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
19e80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
19e90 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
19ea0 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
19eb0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
19ec0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
19ed0 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
19ee0 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
19ef0 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30   SF_Expanded)!=0
19f00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
19f10 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
19f20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
19f30 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54  F_Expanded;.  pT
19f40 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
19f50 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
19f60 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61  pEList;..  /* Ma
19f70 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
19f80 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
19f90 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
19fa0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
19fb0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19fc0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
19fd0 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
19fe0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
19ff0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
1a000 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
1a010 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
1a020 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
1a030 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1a040 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
1a050 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
1a060 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
1a070 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
1a080 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
1a090 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
1a0a0 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
1a0b0 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
1a0c0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
1a0d0 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
1a0e0 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
1a0f0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
1a100 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
1a110 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1a120 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
1a130 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
1a140 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
1a150 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
1a160 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
1a170 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1a180 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
1a190 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
1a1a0 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
1a1b0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
1a1c0 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
1a1d0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1a1e0 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  une;.    }.    i
1a1f0 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
1a200 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
1a210 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1a220 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
1a230 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
1a240 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
1a250 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
1a260 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1a270 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
1a280 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
1a290 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
1a2a0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
1a2b0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
1a2c0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1a2d0 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
1a2e0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
1a2f0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
1a300 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1a310 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
1a320 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
1a330 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
1a340 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
1a350 54 61 62 2d 3e 64 62 4d 65 6d 20 3d 20 64 62 2d  Tab->dbMem = db-
1a360 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
1a370 6c 65 64 20 3f 20 64 62 20 3a 20 30 3b 0a 20 20  led ? db : 0;.  
1a380 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d      pTab->nRef =
1a390 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   1;.      pTab->
1a3a0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
1a3b0 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
1a3c0 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22  te_subquery_%p_"
1a3d0 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
1a3e0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
1a3f0 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
1a400 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
1a410 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74  ; }.      select
1a420 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
1a430 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
1a440 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
1a450 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
1a460 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
1a470 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
1a480 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
1a490 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
1a4a0 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  l;.#endif.    }e
1a4b0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
1a4c0 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
1a4d0 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
1a4e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1a4f0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1a500 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
1a510 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
1a520 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
1a530 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
1a540 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
1a550 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c  ,0,pFrom->zName,
1a560 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pFrom->zDatabase
1a570 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
1a580 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
1a590 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
1a5a0 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66  Tab->nRef++;.#if
1a5b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1a5c0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
1a5d0 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
1a5e0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1a5f0 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  E).      if( pTa
1a600 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73  b->pSelect || Is
1a610 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
1a620 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72  .        /* We r
1a630 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65  each here if the
1a640 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20   named table is 
1a650 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20  a really a view 
1a660 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
1a670 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
1a680 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
1a690 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   pTab) ) return 
1a6a0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
1a6b0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
1a6c0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
1a6d0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
1a6e0 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
1a6f0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
1a700 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ab->pSelect, 0);
1a710 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a720 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
1a730 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  er, pFrom->pSele
1a740 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ct);.      }.#en
1a750 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
1a760 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  * Locate the ind
1a770 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20  ex named by the 
1a780 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1a790 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  e, if any. */.  
1a7a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64    if( sqlite3Ind
1a7b0 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61  exedByLookup(pPa
1a7c0 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
1a7d0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
1a7e0 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Abort;.    }.  }
1a7f0 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
1a800 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
1a810 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
1a820 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
1a830 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ns..  */.  if( d
1a840 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a850 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  || sqliteProcess
1a860 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
1a870 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
1a880 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
1a890 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
1a8a0 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
1a8b0 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
1a8c0 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
1a8d0 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
1a8e0 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
1a8f0 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
1a900 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
1a910 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
1a920 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
1a930 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
1a940 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
1a950 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
1a960 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
1a970 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
1a980 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
1a990 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
1a9a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
1a9b0 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
1a9c0 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
1a9d0 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
1a9e0 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
1a9f0 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
1aa00 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
1aa10 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
1aa20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
1aa30 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
1aa40 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
1aa50 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
1aa60 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
1aa70 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
1aa80 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
1aa90 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
1aaa0 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
1aab0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
1aac0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
1aad0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
1aae0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
1aaf0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
1ab00 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
1ab10 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
1ab20 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d   || pE->pRight!=
1ab30 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1ab40 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
1ab50 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30  || (pE->pLeft!=0
1ab60 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
1ab70 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20  p==TK_ID) );.   
1ab80 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1ab90 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
1aba0 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  t->op==TK_ALL ) 
1abb0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
1abc0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
1abd0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
1abe0 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
1abf0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
1ac00 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
1ac10 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
1ac20 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
1ac30 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
1ac40 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
1ac50 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
1ac60 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
1ac70 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
1ac80 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
1ac90 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
1aca0 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
1acb0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1acc0 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
1acd0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
1ace0 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
1acf0 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
1ad00 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
1ad10 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
1ad20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
1ad30 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad50 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
1ad60 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
1ad70 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
1ad80 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
1ad90 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
1ada0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
1adb0 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
1adc0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
1add0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
1ade0 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
1adf0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
1ae00 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e  =TK_ALL && (pE->
1ae10 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
1ae20 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ->pRight->op!=TK
1ae30 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
1ae40 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
1ae50 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
1ae60 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1ae70 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
1ae80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1ae90 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1aea0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1aeb0 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
1aec0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1aed0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
1aee0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
1aef0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
1af00 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
1af10 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1af20 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
1af30 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
1af40 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
1af50 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
1af60 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
1af70 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
1af80 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
1af90 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
1afa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1afb0 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
1afc0 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
1afd0 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
1afe0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
1aff0 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
1b000 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1b010 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
1b020 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
1b030 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
1b040 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
1b050 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20  ar *zTName;     
1b060 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
1b070 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
1b080 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1b090 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  E->op==TK_DOT ){
1b0a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1b0b0 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  t( pE->pLeft!=0 
1b0c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
1b0d0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1b0e0 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c  perty(pE->pLeft,
1b0f0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1b100 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
1b110 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75  e = pE->pLeft->u
1b120 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
1b130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b140 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20    zTName = 0;.  
1b150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b160 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
1b170 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
1b180 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1b190 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
1b1a0 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
1b1b0 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
1b1c0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
1b1d0 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
1b1e0 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
1b1f0 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
1b200 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
1b210 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
1b220 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
1b230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b240 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1b250 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
1b260 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
1b270 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
1b280 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
1b290 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1b2b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1b2c0 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c  }.          tabl
1b2d0 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eSeen = 1;.     
1b2e0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1b2f0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
1b300 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
1b310 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67  pr *pExpr, *pRig
1b320 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
1b330 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
1b340 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
1b350 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
1b360 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20  har *zColname;  
1b370 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20  /* The computed 
1b380 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
1b390 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
1b3a0 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d  *zToFree;   /* M
1b3b0 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74  alloced string t
1b3c0 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
1b3d0 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  freed */.       
1b3e0 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e       Token sColn
1b3f0 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ame;  /* Compute
1b400 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73  d column name as
1b410 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20   a token */..   
1b420 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
1b430 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
1b440 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63  d as 'hidden' (c
1b450 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f  urrently only po
1b460 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20  ssible.         
1b470 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61     ** for virtua
1b480 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f  l tables), do no
1b490 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20  t include it in 
1b4a0 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
1b4b0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
1b4c0 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20  lt-set list..   
1b4d0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1b4e0 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69          if( IsHi
1b4f0 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
1b500 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20  ->aCol[j]) ){.  
1b510 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1b520 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  rt(IsVirtual(pTa
1b530 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b));.           
1b540 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1b550 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
1b560 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
1b570 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a  && zTName==0 ){.
1b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1b590 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1b5a0 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62  m *pLeft = &pTab
1b5b0 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20  List->a[i-1];.  
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b5d0 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79  (pLeft[1].jointy
1b5e0 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
1b5f0 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1b610 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
1b620 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d  ->pTab, zName)>=
1b630 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1b640 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
1b650 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
1b660 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
1b670 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
1b680 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
1b690 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
1b6a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1b6b0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b6e0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
1b6f0 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69  ex(pLeft[1].pUsi
1b700 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
1b710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b720 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
1b730 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
1b740 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
1b750 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1b760 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
1b770 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
1b780 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
1b790 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
1b7a0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1b7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1b7c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1b7d0 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
1b7e0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
1b7f0 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65  db, TK_ID, zName
1b800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
1b810 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  Colname = zName;
1b820 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
1b830 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
1b840 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
1b850 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
1b860 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
1b870 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
1b880 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
1b890 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
1b8a0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
1b8b0 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  D, zTabName);.  
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1b8d0 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
1b8e0 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
1b8f0 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
1b900 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1b910 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
1b920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b930 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71     zColname = sq
1b940 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1b950 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61   "%s.%s", zTabNa
1b960 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
1b970 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
1b980 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  ree = zColname;.
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1b9b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1b9c0 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
1b9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1b9e0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
1b9f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1ba00 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1ba10 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
1ba20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61            sColna
1ba30 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  me.z = zColname;
1ba40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f  .            sCo
1ba50 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65  lname.n = sqlite
1ba60 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61  3Strlen30(zColna
1ba70 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1ba80 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1ba90 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
1baa0 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c  pNew, &sColname,
1bab0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1bac0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1bad0 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20  b, zToFree);.   
1bae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1baf0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
1bb00 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
1bb10 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
1bb20 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1bb30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1bb40 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1bb50 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
1bb60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1bb70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bb80 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1bb90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1bba0 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
1bbb0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
1bbc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bbd0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1bbe0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1bbf0 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
1bc00 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
1bc10 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  New;.  }.#if SQL
1bc20 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
1bc30 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26   if( p->pEList &
1bc40 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  & p->pEList->nEx
1bc50 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
1bc60 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
1bc70 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
1bc80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1bc90 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
1bca0 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
1bcb0 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t");.  }.#endif.
1bcc0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1bcd0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
1bce0 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
1bcf0 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
1bd00 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
1bd10 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1bd20 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
1bd30 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
1bd40 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
1bd50 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
1bd60 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
1bd70 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
1bd80 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
1bd90 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
1bda0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1bdb0 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
1bdc0 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
1bdd0 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
1bde0 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
1bdf0 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
1be00 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
1be10 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
1be20 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
1be30 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  rser tree..*/.st
1be40 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c  atic int exprWal
1be50 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
1be60 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
1be70 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
1be80 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
1be90 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
1bea0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1beb0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
1bec0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
1bed0 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
1bee0 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
1bef0 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
1bf00 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
1bf10 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1bf20 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
1bf30 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
1bf40 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
1bf50 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
1bf60 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
1bf70 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
1bf80 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
1bf90 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
1bfa0 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
1bfb0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
1bfc0 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
1bfd0 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
1bfe0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
1bff0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c000 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
1c010 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
1c020 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
1c030 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
1c040 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
1c050 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
1c060 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
1c070 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
1c080 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
1c090 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
1c0a0 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
1c0b0 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
1c0c0 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
1c0d0 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
1c0e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
1c0f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1c100 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
1c110 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
1c120 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
1c130 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
1c140 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
1c150 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61  ack = selectExpa
1c160 6e 64 65 72 3b 0a 20 20 77 2e 78 45 78 70 72 43  nder;.  w.xExprC
1c170 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61  allback = exprWa
1c180 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
1c190 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
1c1a0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
1c1b0 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
1c1c0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1c1d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1c1e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
1c1f0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
1c200 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
1c210 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
1c220 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
1c230 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
1c240 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
1c250 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
1c260 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
1c270 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
1c280 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
1c290 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
1c2a0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1c2b0 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
1c2c0 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
1c2d0 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
1c2e0 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
1c2f0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
1c300 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
1c310 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
1c320 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
1c330 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
1c340 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
1c350 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
1c360 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
1c370 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
1c380 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
1c390 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
1c3a0 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
1c3b0 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
1c3c0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
1c3d0 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
1c3e0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
1c3f0 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41 64  tic int selectAd
1c400 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
1c410 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  o(Walker *pWalke
1c420 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
1c430 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
1c440 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69    int i;.  SrcLi
1c450 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
1c460 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1c470 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61  tem *pFrom;..  a
1c480 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
1c490 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
1c4a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1c4b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1c4c0 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20  HasTypeInfo)==0 
1c4d0 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  );.  p->selFlags
1c4e0 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e   |= SF_HasTypeIn
1c4f0 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  fo;.  pParse = p
1c500 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
1c510 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1c520 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  pSrc;.  for(i=0,
1c530 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
1c540 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
1c550 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
1c560 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
1c570 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1c580 61 62 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41  ab;.    if( ALWA
1c590 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20 28  YS(pTab!=0) && (
1c5a0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
1c5b0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
1c5c0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
1c5d0 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
1c5e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1c5f0 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
1c600 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
1c610 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
1c620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c630 53 65 6c 20 29 3b 0a 20 20 20 20 20 20 77 68 69  Sel );.      whi
1c640 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
1c650 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
1c660 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 65  pPrior;.      se
1c670 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
1c680 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
1c690 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
1c6a0 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
1c6b0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  el);.    }.  }. 
1c6c0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1c6d0 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  inue;.}.#endif..
1c6e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1c6f0 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70  ine adds datatyp
1c700 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  e and collating 
1c710 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61  sequence informa
1c720 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54  tion to.** the T
1c730 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  able structures 
1c740 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  of all FROM-clau
1c750 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  se subqueries in
1c760 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
1c770 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73  tement..**.** Us
1c780 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  e this routine a
1c790 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
1c7a0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1c7b0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1c7c0 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61  ctAddTypeInfo(Pa
1c7d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
1c7e0 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23  ect *pSelect){.#
1c7f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c800 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61  IT_SUBQUERY.  Wa
1c810 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c  lker w;.  w.xSel
1c820 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
1c830 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
1c840 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
1c850 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
1c860 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
1c870 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
1c880 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1c890 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
1c8a0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
1c8b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c8c0 73 65 74 73 20 6f 66 20 61 20 53 45 4c 45 43 54  sets of a SELECT
1c8d0 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
1c8e0 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
1c8f0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
1c900 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
1c910 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
1c920 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
1c930 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
1c940 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
1c950 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
1c960 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
1c970 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
1c980 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
1c990 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
1c9a0 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
1c9b0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1c9c0 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
1c9d0 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
1c9e0 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
1c9f0 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
1ca00 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
1ca10 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
1ca20 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
1ca30 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
1ca40 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
1ca50 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
1ca60 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1ca70 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
1ca80 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
1ca90 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
1caa0 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
1cab0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1cac0 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
1cad0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1cae0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
1caf0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1cb00 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1cb10 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
1cb20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
1cb30 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
1cb40 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
1cb50 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
1cb60 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
1cb70 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
1cb80 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45   *db;.  if( NEVE
1cb90 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
1cba0 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1cbb0 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  >db;.  if( p->se
1cbc0 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
1cbd0 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
1cbe0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1cbf0 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
1cc00 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
1cc10 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1cc20 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1cc30 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
1cc40 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
1cc50 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
1cc60 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
1cc70 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1cc80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1cc90 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1cca0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
1ccb0 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
1ccc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
1ccd0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
1cce0 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
1ccf0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
1cd00 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
1cd10 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
1cd20 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
1cd30 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
1cd40 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
1cd50 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
1cd60 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
1cd70 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72  tine simply stor
1cd80 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
1cd90 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20  of those memory 
1cda0 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
1cdb0 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
1cdc0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
1cdd0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1cde0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1cdf0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1ce00 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1ce10 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1ce20 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66  unc *pFunc;.  if
1ce30 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
1ce40 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  c+pAggInfo->nCol
1ce50 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  umn==0 ){.    re
1ce60 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
1ce70 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
1ce80 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
1ce90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cea0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1ceb0 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61  , 0, pAggInfo->a
1cec0 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20  Col[i].iMem);.  
1ced0 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  }.  for(pFunc=pA
1cee0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
1cef0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
1cf00 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
1cf10 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c++){.    sqlite
1cf20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cf30 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63  P_Null, 0, pFunc
1cf40 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28  ->iMem);.    if(
1cf50 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
1cf60 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t>=0 ){.      Ex
1cf70 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e  pr *pE = pFunc->
1cf80 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1cf90 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1cfa0 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73  perty(pE, EP_xIs
1cfb0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
1cfc0 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74   if( pE->x.pList
1cfd0 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69  ==0 || pE->x.pLi
1cfe0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
1cff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1d000 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1d010 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67  "DISTINCT aggreg
1d020 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65  ates must have e
1d030 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20  xactly one ".   
1d040 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e          "argumen
1d050 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  t");.        pFu
1d060 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
1d070 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1d080 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
1d090 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
1d0a0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1d0b0 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
1d0c0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73  List);.        s
1d0d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d0e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1d0f0 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
1d100 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d120 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1d130 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1d140 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1d150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d160 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
1d170 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
1d180 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
1d190 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
1d1a0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
1d1b0 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
1d1c0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
1d1d0 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
1d1e0 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
1d1f0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
1d200 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
1d210 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1d220 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1d230 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1d240 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
1d250 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
1d260 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
1d270 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1d280 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
1d290 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
1d2a0 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
1d2b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
1d2c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d2d0 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
1d2e0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73  Select) );.    s
1d2f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d300 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c  (v, OP_AggFinal,
1d310 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74   pF->iMem, pList
1d320 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
1d330 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  : 0, 0,.        
1d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1d350 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
1d360 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d  P4_FUNCDEF);.  }
1d370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1d380 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
1d390 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
1d3a0 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62  r an aggregate b
1d3b0 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  ased on.** the c
1d3c0 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
1d3d0 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  sition..*/.stati
1d3e0 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
1d3f0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
1d400 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
1d410 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
1d420 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1d430 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1d440 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1d450 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
1d460 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1d470 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
1d480 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
1d490 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1d4a0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
1d4b0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  );.  for(i=0, pF
1d4c0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1d4d0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1d4e0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
1d4f0 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
1d500 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
1d510 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
1d520 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Agg;.    ExprLis
1d530 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
1d540 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1d550 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1d560 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
1d570 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1d580 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
1d590 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
1d5a0 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
1d5b0 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
1d5c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1d5d0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1d5e0 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
1d5f0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
1d600 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
1d610 74 2c 20 72 65 67 41 67 67 2c 20 30 29 3b 0a 20  t, regAgg, 0);. 
1d620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d630 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
1d640 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
1d650 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
1d660 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
1d670 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
1d680 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1d690 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
1d6a0 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
1d6b0 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
1d6c0 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
1d6d0 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
1d6e0 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
1d6f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1d700 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20  F->pFunc->flags 
1d710 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
1d720 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
1d730 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
1d740 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
1d750 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1d760 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
1d770 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
1d780 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
1d790 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
1d7a0 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44  ->pFunc has NEED
1d7b0 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f  COLL */.      fo
1d7c0 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
1d7d0 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
1d7e0 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
1d7f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
1d800 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1d810 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1d820 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
1d830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d840 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
1d850 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
1d860 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
1d870 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
1d880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d890 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
1d8a0 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
1d8b0 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
1d8c0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
1d8d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d8e0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp4(v, OP_AggSt
1d8f0 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
1d900 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20  F->iMem,.       
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1d920 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
1d930 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
1d940 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1d950 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
1d960 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
1d970 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
1d980 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
1d990 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
1d9a0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1d9b0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1d9c0 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
1d9d0 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
1d9e0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
1d9f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1da00 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
1da10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1da20 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
1da30 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
1da40 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
1da50 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
1da60 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
1da70 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
1da80 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
1da90 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1daa0 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
1dab0 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
1dac0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1dad0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
1dae0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
1daf0 61 72 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arse);.}../*.** 
1db00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1db10 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
1db20 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
1db30 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
1db40 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
1db50 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
1db60 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
1db70 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
1db80 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
1db90 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65   of the SelectDe
1dba0 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  st structure poi
1dbb0 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d  nted to by argum
1dbc0 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20  ent pDest.** as 
1dbd0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1dbe0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20     pDest->eDest 
1dbf0 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
1dc00 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
1dc10 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
1dc20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dc30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
1dc40 20 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20      SRT_Output  
1dc50 20 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72      Generate a r
1dc60 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73  ow of output (us
1dc70 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  ing the OP_Resul
1dc80 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  tRow.**         
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f              opco
1dca0 64 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77  de) for each row
1dcb0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
1dcc0 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  et..**.**     SR
1dcd0 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e  T_Mem         On
1dce0 6c 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20  ly valid if the 
1dcf0 72 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67  result is a sing
1dd00 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20  le column..**   
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73    Store the firs
1dd30 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
1dd40 66 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77  first result row
1dd50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1dd60 20 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73          in regis
1dd70 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ter pDest->iParm
1dd80 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68   then abandon th
1dd90 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20  e rest.**       
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
1ddb0 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
1ddc0 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d  s destination im
1ddd0 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e  plies "LIMIT 1".
1dde0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53  .**.**     SRT_S
1ddf0 65 74 20 20 20 20 20 20 20 20 20 54 68 65 20 72  et         The r
1de00 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20  esult must be a 
1de10 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20  single column.  
1de20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20  Store each.**   
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de40 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20    row of result 
1de50 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61  as the key in ta
1de60 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1de70 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  . .**           
1de80 20 20 20 20 20 20 20 20 20 20 41 70 70 6c 79 20            Apply 
1de90 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 44 65  the affinity pDe
1dea0 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 62 65 66  st->affinity bef
1deb0 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20  ore storing.**  
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65     results.  Use
1dee0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
1def0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1df00 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1df10 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
1df20 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
1df30 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
1df40 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
1df50 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
1df60 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
1df70 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
1df80 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
1df90 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
1dfa0 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
1dfb0 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20  SRT_Table       
1dfc0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
1dfd0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1dfe0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1dff0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e000 20 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69        This is li
1e010 6b 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20  ke SRT_EphemTab 
1e020 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
1e030 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
1e050 61 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61  assumed to alrea
1e060 64 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a  dy be open..**.*
1e070 2a 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54  *     SRT_EphemT
1e080 61 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20  ab    Create an 
1e090 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1e0a0 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64  pDest->iParm and
1e0b0 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20   store.**       
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1e0d0 65 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20  e result there. 
1e0e0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1e0f0 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a  ft open after.**
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20       returning. 
1e120 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52   This is like SR
1e130 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20 74  T_Table except t
1e140 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1e150 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20             this 
1e160 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73  destination uses
1e170 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1e180 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20  l to create.**  
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69 72     the table fir
1e1b0 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  st..**.**     SR
1e1c0 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65  T_Coroutine   Ge
1e1d0 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74  nerate a co-rout
1e1e0 69 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e 73  ine that returns
1e1f0 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a   a new row of.**
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 20 20 20 20 20 72 65 73 75 6c 74 73 20 65 61 63       results eac
1e220 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76  h time it is inv
1e230 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79  oked.  The entry
1e240 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20   point.**       
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
1e260 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
1e270 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
1e280 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61  ister pDest->iPa
1e290 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
1e2a0 54 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74  T_Exists      St
1e2b0 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72  ore a 1 in memor
1e2c0 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50  y cell pDest->iP
1e2d0 61 72 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c  arm if the resul
1e2e0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1e2f0 20 20 20 20 20 20 20 20 20 73 65 74 20 69 73 20           set is 
1e300 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  not empty..**.**
1e310 20 20 20 20 20 53 52 54 5f 44 69 73 63 61 72 64       SRT_Discard
1e320 20 20 20 20 20 54 68 72 6f 77 20 74 68 65 20 72       Throw the r
1e330 65 73 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68  esults away.  Th
1e340 69 73 20 69 73 20 75 73 65 64 20 62 79 20 53 45  is is used by SE
1e350 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
1e360 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74              stat
1e370 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72  ements within tr
1e380 69 67 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c  iggers whose onl
1e390 79 20 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20  y purpose is.** 
1e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3b0 20 20 20 20 74 68 65 20 73 69 64 65 2d 65 66 66      the side-eff
1e3c0 65 63 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e  ects of function
1e3d0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1e3e0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1e3f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1e400 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
1e410 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
1e420 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
1e430 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1e440 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
1e450 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
1e460 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
1e470 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
1e480 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
1e490 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
1e4a0 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
1e4b0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1e4c0 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
1e4d0 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
1e4e0 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
1e4f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1e500 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1e510 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1e520 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1e530 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
1e540 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
1e550 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53  ng coded. */.  S
1e560 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
1e570 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
1e580 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65   do with the que
1e590 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
1e5a0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1e5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1e5c0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1e5d0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1e5e0 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
1e5f0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
1e600 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
1e610 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1e620 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
1e630 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
1e640 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1e650 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
1e660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e670 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
1e680 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
1e690 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
1e6a0 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
1e6b0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
1e6c0 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
1e6d0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
1e6e0 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
1e6f0 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
1e700 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
1e710 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1e720 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e730 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
1e740 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1e750 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1e760 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By;    /* The OR
1e770 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1e780 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1e790 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
1e7a0 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
1e7b0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1e7c0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1e7d0 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
1e7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e7f0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
1e800 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1e810 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b   int isDistinct;
1e820 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e830 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
1e840 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
1e850 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  nt */.  int dist
1e860 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f  inct;          /
1e870 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66  * Table to use f
1e880 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
1e890 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  set */.  int rc 
1e8a0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1e8b0 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1e8c0 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
1e8d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
1e8e0 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20  ddrSortIndex;   
1e8f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1e900 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  an OP_OpenEpheme
1e910 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
1e920 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
1e930 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
1e940 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
1e950 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
1e960 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
1e970 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
1e980 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1e990 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
1e9a0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1e9b0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
1e9c0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1e9d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
1e9e0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1e9f0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1ea00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ea10 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1ea20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1ea30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1ea40 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1ea50 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
1ea60 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
1ea70 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
1ea80 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
1ea90 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
1eaa0 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72 61  );..  if( Ignora
1eab0 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
1eac0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
1ead0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1eae0 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
1eaf0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
1eb00 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
1eb10 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
1eb20 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
1eb30 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1eb40 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 2f  _Discard);.    /
1eb50 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61  * If ORDER BY ma
1eb60 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63  kes no differenc
1eb70 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  e in the output 
1eb80 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65  then neither doe
1eb90 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43  s.    ** DISTINC
1eba0 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72  T so it can be r
1ebb0 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20  emoved too. */. 
1ebc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1ebd0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
1ebe0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
1ebf0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1ec00 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
1ec10 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
1ec20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
1ec30 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
1ec40 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65 72   p, 0);.  pOrder
1ec50 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1ec60 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
1ec70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
1ec80 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
1ec90 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1eca0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1ecb0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1ecc0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
1ecd0 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73  .  isAgg = (p->s
1ece0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
1ecf0 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73  regate)!=0;.  as
1ed00 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
1ed10 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  );..  /* Begin g
1ed20 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a  enerating code..
1ed30 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
1ed40 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1ed50 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
1ed60 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1ed70 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1ed80 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
1ed90 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
1eda0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
1edb0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1edc0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1edd0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1ede0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1edf0 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d  ).  for(i=0; !p-
1ee00 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61  >pPrior && i<pTa
1ee10 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1ee20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
1ee30 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1ee40 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
1ee50 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
1ee60 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
1ee70 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
1ee80 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
1ee90 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a   int isAggSub;..
1eea0 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
1eeb0 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75  || pItem->isPopu
1eec0 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65  lated ) continue
1eed0 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  ;..    /* Increm
1eee0 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
1eef0 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
1ef00 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
1ef10 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
1ef20 20 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f   tree refered to
1ef30 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
1ef40 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
1ef50 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
1ef60 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
1ef70 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1ef80 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
1ef90 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
1efa0 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
1efb0 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
1efc0 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
1efd0 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
1efe0 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
1eff0 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
1f000 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
1f010 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
1f020 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
1f030 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
1f040 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
1f050 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
1f060 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  ight(p);..    /*
1f070 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1f080 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63 61   the subquery ca
1f090 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e  n be absorbed in
1f0a0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a  to the parent. *
1f0b0 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  /.    isAggSub =
1f0c0 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
1f0d0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
1f0e0 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  !=0;.    if( fla
1f0f0 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
1f100 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
1f110 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
1f120 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75       if( isAggSu
1f130 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41  b ){.        isA
1f140 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gg = 1;.        
1f150 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1f160 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
1f170 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d     }.      i = -
1f180 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1f190 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1f1a0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
1f1b0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
1f1c0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
1f1d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1f1e0 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
1f1f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1f200 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
1f210 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
1f220 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73  .      pItem->is
1f230 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20  Populated = 1;. 
1f240 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70     }.    if( /*p
1f250 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f  Parse->nErr ||*/
1f260 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1f270 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  d ){.      goto 
1f280 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1f290 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  }.    pParse->nH
1f2a0 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33  eight -= sqlite3
1f2b0 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
1f2c0 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  (p);.    pTabLis
1f2d0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
1f2e0 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
1f2f0 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
1f300 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
1f310 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1f320 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73     }.  }.  pELis
1f330 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23  t = p->pEList;.#
1f340 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d  endif.  pWhere =
1f350 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47   p->pWhere;.  pG
1f360 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
1f370 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
1f380 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
1f390 69 73 44 69 73 74 69 6e 63 74 20 3d 20 28 70 2d  isDistinct = (p-
1f3a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1f3b0 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69  istinct)!=0;..#i
1f3c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f3d0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1f3e0 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  T.  /* If there 
1f3f0 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63  is are a sequenc
1f400 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f  e of queries, do
1f410 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65   the earlier one
1f420 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  s first..  */.  
1f430 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
1f440 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67  .    if( p->pRig
1f450 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20  htmost==0 ){.   
1f460 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
1f470 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  , *pRight = 0;. 
1f480 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30       int cnt = 0
1f490 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65  ;.      int mxSe
1f4a0 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  lect;.      for(
1f4b0 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
1f4c0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
1f4d0 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20  ior, cnt++){.   
1f4e0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67       pLoop->pRig
1f4f0 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20  htmost = p;.    
1f500 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74      pLoop->pNext
1f510 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
1f520 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f     pRight = pLoo
1f530 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
1f540 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e   mxSelect = db->
1f550 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
1f560 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
1f570 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ECT];.      if( 
1f580 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e  mxSelect && cnt>
1f590 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  mxSelect ){.    
1f5a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1f5b0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
1f5c0 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63   many terms in c
1f5d0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29  ompound SELECT")
1f5e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f5f0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1f600 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  }.    return mul
1f610 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
1f620 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a   p, pDest);.  }.
1f630 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1f640 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72  writing to memor
1f650 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  y or generating 
1f660 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20  a set.  ** only 
1f670 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
1f680 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  may be output.. 
1f690 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1f6a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1f6b0 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d  .  if( checkForM
1f6c0 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
1f6d0 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44  Error(pParse, pD
1f6e0 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  est, pEList->nEx
1f6f0 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  pr) ){.    goto 
1f700 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
1f710 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1f720 70 6f 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74  possible, rewrit
1f730 65 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 75  e the query to u
1f740 73 65 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74  se GROUP BY inst
1f750 65 61 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e  ead of DISTINCT.
1f760 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d  .  ** GROUP BY m
1f770 69 67 68 74 20 75 73 65 20 61 6e 20 69 6e 64 65  ight use an inde
1f780 78 2c 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65  x, DISTINCT neve
1f790 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 61  r does..  */.  a
1f7a0 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
1f7b0 42 79 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73 65 6c  By==0 || (p->sel
1f7c0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
1f7d0 67 61 74 65 29 21 3d 30 20 29 3b 0a 20 20 69 66  gate)!=0 );.  if
1f7e0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1f7f0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1f800 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
1f810 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
1f820 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
1f830 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1f840 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
1f850 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42   0);.    pGroupB
1f860 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
1f870 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
1f880 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
1f890 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74  ;.    isDistinct
1f8a0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1f8b0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
1f8c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
1f8d0 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e  then this sortin
1f8e0 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67  g.  ** index mig
1f8f0 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
1f900 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
1f910 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20  ta can be .  ** 
1f920 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
1f930 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20  -sorted order.  
1f940 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
1f950 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ase, then the.  
1f960 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  ** OP_OpenEpheme
1f970 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
1f980 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1f990 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
1f9a0 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72  ce.  ** we figur
1f9b0 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
1f9c0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  orting index is 
1f9d0 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
1f9e0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20   addrSortIndex. 
1f9f0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
1fa00 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
1fa10 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  te that change..
1fa20 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
1fa30 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
1fa40 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1fa50 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
1fa60 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1fa70 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
1fa80 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  y);.    pOrderBy
1fa90 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  ->iECursor = pPa
1faa0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1fab0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
1fac0 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e  [2] = addrSortIn
1fad0 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
1fae0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1faf0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1fb00 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
1fb20 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
1fb30 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
1fb40 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  r+2, 0,.        
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
1fb70 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
1fb80 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65  ANDOFF);.  }else
1fb90 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e  {.    addrSortIn
1fba0 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
1fbb0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
1fbc0 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
1fbd0 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
1fbe0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
1fbf0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
1fc00 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1fc10 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
1fc20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fc30 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
1fc40 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
1fc50 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  >iParm, pEList->
1fc60 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
1fc70 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
1fc80 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
1fc90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1fca0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
1fcb0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
1fcc0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
1fcd0 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61  d);..  /* Open a
1fce0 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
1fcf0 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
1fd00 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
1fd10 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63  .  if( isDistinc
1fd20 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  t ){.    KeyInfo
1fd30 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
1fd40 61 73 73 65 72 74 28 20 69 73 41 67 67 20 7c 7c  assert( isAgg ||
1fd50 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20   pGroupBy );.   
1fd60 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72   distinct = pPar
1fd70 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1fd80 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
1fd90 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
1fda0 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
1fdb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1fdc0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1fdd0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69  penEphemeral, di
1fde0 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1fe10 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
1fe20 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65  O_HANDOFF);.  }e
1fe30 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
1fe40 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
1fe50 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20  * Aggregate and 
1fe60 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
1fe70 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65  eries are handle
1fe80 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f  d differently */
1fe90 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
1fea0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
1feb0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
1fec0 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72   is for non-aggr
1fed0 65 67 61 74 65 20 71 75 65 72 69 65 73 0a 20 20  egate queries.  
1fee0 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64    ** Begin the d
1fef0 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20  atabase scan.   
1ff00 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
1ff10 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1ff20 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
1ff30 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f  ist, pWhere, &pO
1ff40 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20  rderBy, 0);.    
1ff50 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
1ff60 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1ff70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
1ff80 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
1ff90 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
1ffa0 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
1ffb0 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
1ffc0 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
1ffd0 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
1ffe0 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
1fff0 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
20000 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
20010 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
20020 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64     */.    if( ad
20030 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
20040 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  & pOrderBy==0 ){
20050 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20060 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
20070 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c  , addrSortIndex,
20080 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64   1);.      p->ad
20090 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
200a0 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
200b0 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
200c0 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20  rd inner loop.  
200d0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
200e0 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a 20 20  !isDistinct);.  
200f0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
20100 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
20110 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
20120 72 42 79 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a  rBy, -1, pDest,.
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20140 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
20150 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
20160 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  Break);..    /* 
20170 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
20180 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
20190 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
201a0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
201b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
201c0 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63  This is the proc
201d0 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
201e0 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
201f0 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
20200 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
20210 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
20220 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
20230 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
20240 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
20250 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
20260 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
20270 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
20280 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
20290 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
202a0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
202b0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
202c0 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
202d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
202e0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
202f0 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
20300 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
20310 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
20340 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
20350 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
20360 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
20390 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
203a0 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
203b0 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
203c0 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
203d0 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
203e0 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
203f0 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
20400 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
20410 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
20420 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
20430 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
20440 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
20450 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
20460 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  LECT */..    /* 
20470 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61  Remove any and a
20480 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65  ll aliases betwe
20490 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  en the result se
204a0 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  t and the.    **
204b0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
204c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
204d0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
204e0 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20     int k;       
204f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20500 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20510 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
20520 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
20530 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c  pItem;  /* For l
20540 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72  ooping over expr
20550 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74  ession in a list
20560 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b   */..      for(k
20570 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
20580 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69  r, pItem=p->pELi
20590 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  st->a; k>0; k--,
205a0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
205b0 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
205c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
205d0 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70      for(k=pGroup
205e0 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  By->nExpr, pItem
205f0 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e  =pGroupBy->a; k>
20600 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
20610 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
20620 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  >iAlias = 0;.   
20630 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 0a 20 20     }.    }.. .  
20640 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61    /* Create a la
20650 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77  bel to jump to w
20660 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61  hen we want to a
20670 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a  bort the query *
20680 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  /.    addrEnd = 
20690 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
206a0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
206b0 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
206c0 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
206d0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
206e0 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
206f0 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
20700 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
20710 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
20720 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
20730 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
20740 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
20750 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
20760 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
20770 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
20780 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
20790 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
207a0 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
207b0 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  sNC.pAggInfo = &
207c0 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41  sAggInfo;.    sA
207d0 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
207e0 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
207f0 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
20800 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41  pr+1 : 0;.    sA
20810 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
20820 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
20830 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
20840 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
20850 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
20860 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
20870 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
20880 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
20890 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
208a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
208b0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
208c0 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
208d0 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
208e0 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
208f0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
20900 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
20910 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
20920 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
20930 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
20940 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
20950 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
20960 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
20970 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20980 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
20990 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
209a0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
209b0 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
209c0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
209d0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
209e0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
209f0 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
20a00 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
20a10 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
20a20 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
20a30 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
20a40 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
20a50 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
20a60 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
20a70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
20a80 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
20a90 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
20aa0 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
20ab0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
20ac0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
20ad0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31   */.      int j1
20ae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20af0 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
20b00 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
20b10 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
20b20 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
20b30 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
20b40 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
20b50 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
20b60 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
20b70 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
20b80 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
20b90 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
20ba0 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
20bb0 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
20bc0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
20bd0 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
20be0 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
20bf0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
20c00 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
20c10 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
20c20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
20c30 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
20c40 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
20c50 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
20c60 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
20c70 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
20c80 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
20c90 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
20ca0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
20cb0 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
20cc0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
20cd0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
20ce0 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
20cf0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
20d00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
20d10 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
20d20 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
20d30 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
20d40 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
20d50 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
20d60 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
20d70 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
20d80 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
20d90 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
20da0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
20db0 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
20dc0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
20dd0 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
20de0 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
20df0 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
20e00 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
20e10 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
20e20 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
20e30 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
20e40 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
20e50 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
20e60 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a  rse, pGroupBy);.
20e70 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
20e80 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
20e90 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
20ea0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20  penEphemeral, . 
20eb0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
20ec0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
20ed0 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
20ee0 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
20ef0 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
20f00 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
20f10 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20  _HANDOFF);..    
20f20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
20f30 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
20f40 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
20f50 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
20f60 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
20f70 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
20f80 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
20f90 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
20fa0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
20fb0 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
20fc0 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
20fd0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
20fe0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
20ff0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
21000 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
21010 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
21020 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
21030 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
21040 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21050 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
21060 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
21070 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
21080 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
21090 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
210a0 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
210b0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
210c0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
210d0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
210e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
210f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21100 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
21110 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
21120 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21130 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
21140 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
21150 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21160 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
21170 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
21180 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
21190 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
211a0 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
211b0 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
211c0 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
211d0 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
211e0 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
211f0 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
21200 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
21210 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
21220 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
21230 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
21240 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
21250 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
21260 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
21270 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
21280 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
21290 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
212a0 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
212b0 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
212c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
212d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
212e0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
212f0 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
21300 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
21310 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
21320 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
21330 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
21340 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a   &pGroupBy, 0);.
21350 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
21360 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
21370 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
21380 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
21390 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
213a0 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
213b0 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
213c0 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
213d0 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
213e0 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
213f0 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
21400 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
21410 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
21420 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
21430 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
21440 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
21450 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
21460 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
21470 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20       pGroupBy = 
21480 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
21490 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
214a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
214b0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
214c0 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
214d0 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
214e0 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
214f0 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
21500 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
21510 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
21520 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
21530 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
21540 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
21550 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
21560 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
21570 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
21580 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
21590 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
215a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
215b0 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
215c0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
215d0 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
215e0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
215f0 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
21600 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
21610 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
21620 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
21630 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
21640 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
21650 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20  upBy + 1;.      
21660 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
21670 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
21680 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
21690 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
216a0 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
216b0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
216c0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
216d0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
216e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
216f0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
21700 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21710 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
21720 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
21730 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
21740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21750 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
21760 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
21770 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
21780 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
21790 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
217a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
217b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
217c0 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
217d0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
217e0 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f  Idx,regBase+nGro
217f0 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a  upBy);.        j
21800 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20   = nGroupBy+1;. 
21810 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
21820 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
21830 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
21840 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
21850 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
21860 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
21870 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21880 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
21890 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
218a0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
218b0 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
218c0 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a          int r2;.
218d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20  .            r2 
218e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
218f0 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
21900 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
21930 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
21940 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20  ol->iTable, r1, 
21950 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
21960 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20  if( r1!=r2 ){.  
21970 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21980 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21990 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72   OP_SCopy, r2, r
219a0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
219b0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  }.            j+
219c0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
219d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
219e0 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
219f0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
21a00 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
21a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21a20 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
21a30 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
21a40 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
21a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21a60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21a70 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  dxInsert, sAggIn
21a80 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72  fo.sortingIdx, r
21a90 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
21aa0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
21ab0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
21ac0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
21ad0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
21ae0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
21af0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
21b00 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
21b10 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
21b20 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nfo);.        sq
21b30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21b40 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67  v, OP_Sort, sAgg
21b50 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
21b60 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
21b70 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
21b80 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
21b90 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41  t"));.        sA
21ba0 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
21bb0 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
21bc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
21bd0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
21be0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21bf0 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
21c00 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
21c10 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
21c20 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
21c30 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
21c40 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
21c50 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
21c60 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
21c70 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
21c80 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
21c90 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
21ca0 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
21cb0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
21cc0 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
21cd0 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
21ce0 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
21cf0 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
21d00 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
21d10 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
21d20 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
21d30 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
21d40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21d50 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
21d60 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  e);.      for(j=
21d70 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
21d80 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
21d90 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
21da0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
21db0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21dc0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
21dd0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
21de0 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a  gIdx, j, iBMem+j
21df0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21e00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
21e10 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
21e20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
21e30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
21e40 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
21e50 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d  >a[j].pExpr, iBM
21e60 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
21e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
21e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
21e90 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
21ea0 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47  iAMem, iBMem, pG
21eb0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20  roupBy->nExpr,. 
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ed0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
21ee0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
21ef0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20  INFO);.      j1 
21f00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
21f10 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
21f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21f30 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
21f40 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b   j1+1, 0, j1+1);
21f50 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
21f60 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
21f70 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
21f80 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
21f90 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
21fa0 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  es in the GROUP 
21fb0 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
21fc0 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
21fd0 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
21fe0 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
21ff0 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
22000 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
22010 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
22020 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
22030 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
22040 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
22050 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
22060 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
22070 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
22080 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
22090 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
220a0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
220b0 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
220c0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
220d0 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
220e0 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
220f0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
22100 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
22110 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
22120 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
22130 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20  (pParse, iBMem, 
22140 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iAMem, pGroupBy-
22150 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >nExpr);.      s
22160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22170 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
22180 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
22190 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
221a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
221b0 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
221c0 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
221d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
221e0 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
221f0 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
22200 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
22210 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
22220 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
22230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22240 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
22250 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
22260 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
22270 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
22280 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
22290 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
222a0 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
222b0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
222c0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
222d0 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
222e0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
222f0 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
22300 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
22310 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
22320 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
22330 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
22340 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
22350 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22360 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
22370 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
22380 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22390 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61  (v, "indicate da
223a0 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f  ta in accumulato
223b0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
223c0 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  End of the loop.
223d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
223e0 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
223f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22400 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22410 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  P_Next, sAggInfo
22420 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
22430 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
22440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22450 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
22460 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
22470 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
22480 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
22490 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29  drSortingIdx, 1)
224a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
224b0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
224c0 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
224d0 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
224e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
224f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
22500 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
22510 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
22520 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
22530 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
22540 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
22550 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
22560 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
22570 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
22580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22590 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
225a0 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
225b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
225c0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
225d0 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
225e0 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
225f0 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
22600 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
22610 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
22620 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
22630 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
22640 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
22650 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
22660 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
22670 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
22680 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
22690 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
226a0 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
226b0 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
226c0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
226d0 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
226e0 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
226f0 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
22700 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
22710 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
22720 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
22730 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
22740 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
22750 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
22760 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
22770 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
22780 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22790 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
227a0 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
227b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
227c0 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
227d0 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
227e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
227f0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
22800 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
22810 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
22820 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
22830 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
22840 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
22850 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
22860 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
22870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22880 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
22890 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
228a0 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
228b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
228c0 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
228d0 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
228e0 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
228f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22900 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
22910 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
22920 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
22930 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
22940 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
22950 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
22960 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
22970 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
22980 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
22990 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
229a0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
229b0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
229c0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20  , p->pEList, 0, 
229d0 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  0, pOrderBy,.   
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65     distinct, pDe
22a00 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
22a10 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
22a20 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
22a30 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  etAbort);.      
22a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22a50 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
22a60 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
22a70 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
22a80 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
22a90 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
22aa0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
22ab0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
22ac0 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
22ad0 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
22ae0 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
22af0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
22b00 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
22b10 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65  eLabel(v, addrRe
22b20 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65  set);.      rese
22b30 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
22b40 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
22b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22b60 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
22b70 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
22b80 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  ;.     .    } /*
22b90 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e   endif pGroupBy.
22ba0 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74    Begin aggregat
22bb0 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  e queries withou
22bc0 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20  t GROUP BY: */. 
22bd0 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
22be0 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d  ExprList *pDel =
22bf0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
22c00 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
22c10 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
22c20 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
22c30 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
22c40 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
22c50 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
22c60 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
22c70 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
22c80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
22c90 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
22ca0 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
22cb0 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
22cc0 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
22cd0 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
22ce0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
22cf0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
22d00 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
22d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
22d20 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
22d30 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
22d40 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
22d50 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
22d60 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
22d70 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
22d80 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
22d90 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
22da0 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
22db0 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
22dc0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
22dd0 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
22de0 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
22df0 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
22e00 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
22e10 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
22e20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
22e30 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
22e40 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
22e50 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
22e60 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
22e70 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
22e80 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
22e90 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
22ea0 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
22eb0 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
22ec0 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
22ed0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
22ee0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
22ef0 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
22f00 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
22f10 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
22f20 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
22f30 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
22f40 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
22f50 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
22f60 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
22f70 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
22f80 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
22fb0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
22fc0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
22fd0 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
22fe0 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
22ff0 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
23000 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
23010 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
23020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23030 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
23040 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
23050 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
23060 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
23070 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
23080 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
23090 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
230a0 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
230b0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
230c0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
230d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
230e0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
230f0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
23100 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
23110 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
23120 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
23130 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
23140 65 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f  e least amount o
23150 66 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20  f columns. If.  
23160 20 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69        ** there i
23170 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c  s such an index,
23180 20 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73   and it has less
23190 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68   columns than th
231a0 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  e table.        
231b0 2a 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65  ** does, then we
231c0 20 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74   can assume that
231d0 20 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73   it consumes les
231e0 73 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20  s space on disk 
231f0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  and.        ** w
23200 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65  ill therefore be
23210 20 63 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e   cheaper to scan
23220 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
23230 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a  e query result..
23240 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
23250 69 73 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f  is case set iRoo
23260 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
23270 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
23280 20 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20   index b-tree.  
23290 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65        ** and pKe
232a0 79 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79  yInfo to the Key
232b0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 72  Info structure r
232c0 65 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67  equired to navig
232d0 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  ate the.        
232e0 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ** index..      
232f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
23300 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
23310 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
23320 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
23330 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
23340 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
23350 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
23360 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
23370 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23380 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
23390 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
233a0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
233b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
233c0 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e 43  Best || pIdx->nC
233d0 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f  olumn<pBest->nCo
233e0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
233f0 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
23400 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23420 69 66 28 20 70 42 65 73 74 20 26 26 20 70 42 65  if( pBest && pBe
23430 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62  st->nColumn<pTab
23440 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
23450 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73      iRoot = pBes
23460 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  t->tnum;.       
23470 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
23480 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
23490 6f 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  o(pParse, pBest)
234a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
234b0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
234c0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
234d0 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
234e0 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
234f0 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
23500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23510 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
23520 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
23530 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  t, iDb);.       
23540 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
23550 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23560 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
23570 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
23580 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
23590 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
235a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
235b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
235c0 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43  (v, OP_Count, iC
235d0 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  sr, sAggInfo.aFu
235e0 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  nc[0].iMem);.   
235f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23600 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
23610 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20  se, iCsr);.     
23620 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
23630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
23640 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
23650 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
23660 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
23670 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
23680 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
23690 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
236a0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
236b0 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
236c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
236d0 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
236e0 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
236f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
23700 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
23710 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
23720 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
23730 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
23740 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
23750 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
23760 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
23770 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
23780 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
23790 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
237a0 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
237b0 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
237c0 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
237d0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
237e0 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
237f0 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
23800 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
23810 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
23820 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
23830 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
23840 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
23850 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
23860 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
23870 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
23880 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
23890 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
238a0 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
238b0 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
238c0 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
238d0 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
238e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
238f0 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
23900 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
23910 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
23920 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
23930 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
23940 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20 66  y behaviour as f
23950 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20  ollows:.        
23960 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
23970 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  + If the query i
23980 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  s a "SELECT min(
23990 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  x)", then the lo
239a0 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20  op coded by.    
239b0 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65      **     where
239c0 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74  .c should not it
239d0 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76  erate over any v
239e0 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c  alues with a NUL
239f0 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  L value.        
23a00 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20  **     for x..  
23a10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
23a20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69   **   + The opti
23a30 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68  mizer code in wh
23a40 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67  ere.c (the thing
23a50 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68   that decides wh
23a60 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ich.        **  
23a70 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69     index or indi
23a80 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75  ces to use) shou
23a90 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65  ld place a diffe
23aa0 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e  rent priority on
23ab0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20   .        **    
23ac0 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20   satisfying the 
23ad0 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73  'ORDER BY' claus
23ae0 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69  e than it does i
23af0 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20  n other cases.. 
23b00 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65         **     Re
23b10 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20  fer to code and 
23b20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72  comments in wher
23b30 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  e.c for details.
23b40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
23b50 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d      ExprList *pM
23b60 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  inMax = 0;.     
23b70 20 20 20 75 38 20 66 6c 61 67 20 3d 20 6d 69 6e     u8 flag = min
23b80 4d 61 78 51 75 65 72 79 28 70 29 3b 0a 20 20 20  MaxQuery(p);.   
23b90 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b       if( flag ){
23ba0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23bb0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
23bc0 72 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rty(p->pEList->a
23bd0 5b 30 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [0].pExpr, EP_xI
23be0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
23bf0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
23c00 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
23c10 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
23c20 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e  ->a[0].pExpr->x.
23c30 70 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20  pList,0);.      
23c40 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d      pDel = pMinM
23c50 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ax;.          if
23c60 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62  ( pMinMax && !db
23c70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  {.            pM
23c90 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74  inMax->a[0].sort
23ca0 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48  Order = flag!=WH
23cb0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
23cc0 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20  ?1:0;.          
23cd0 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
23ce0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
23cf0 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
23d00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a   }.        }.  .
23d10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
23d20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65  case runs if the
23d30 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e   aggregate has n
23d40 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
23d50 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
23d60 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
23d70 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
23d80 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
23d90 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
23da0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74         ** of out
23db0 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  put..        */.
23dc0 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63          resetAcc
23dd0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
23de0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
23df0 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
23e00 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23e10 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
23e20 2c 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d  , pWhere, &pMinM
23e30 61 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20  ax, flag);.     
23e40 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
23e50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
23e60 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
23e70 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
23e80 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
23e90 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
23ea0 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61    }.        upda
23eb0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
23ec0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
23ed0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
23ee0 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29  MinMax && flag )
23ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
23f00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23f10 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49   OP_Goto, 0, pWI
23f20 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20  nfo->iBreak);.  
23f30 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
23f40 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
23f50 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20   index",.       
23f60 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d           (flag==
23f70 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
23f80 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
23f90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23fa0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
23fb0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
23fc0 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
23fd0 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
23fe0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
23ff0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72      }..      pOr
24000 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
24010 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
24020 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
24030 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51  ing, addrEnd, SQ
24040 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
24050 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
24060 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
24070 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
24080 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20   0, 0, -1, .    
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64    pDest, addrEnd
240b0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
240c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
240d0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
240e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
240f0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
24100 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29  abel(v, addrEnd)
24110 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e  ;.    .  } /* en
24120 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75  dif aggregate qu
24130 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ery */..  /* If 
24140 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
24150 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
24160 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
24170 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
24180 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
24190 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
241a0 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
241b0 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
241c0 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
241d0 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
241e0 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e   p, v, pEList->n
241f0 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20  Expr, pDest);.  
24200 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  }..  /* Jump her
24210 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71  e to skip this q
24220 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
24230 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
24240 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20  bel(v, iEnd);.. 
24250 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77   /* The SELECT w
24260 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
24270 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65  coded.   Set the
24280 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
24290 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  0.  ** to indica
242a0 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20  te no errors..  
242b0 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20  */.  rc = 0;..  
242c0 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
242d0 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
242e0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
242f0 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
24300 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
24310 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
24320 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
24330 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20  lect_end:..  /* 
24340 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
24350 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73  names if results
24360 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61   of the SELECT a
24370 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  re to be output.
24380 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
24390 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65  SQLITE_OK && pDe
243a0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
243b0 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
243c0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
243d0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
243e0 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
243f0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
24400 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  (db, sAggInfo.aC
24410 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ol);.  sqlite3Db
24420 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
24430 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75  o.aFunc);.  retu
24440 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65  rn rc;.}..#if de
24450 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
24460 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  UG)./*.*********
24470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244b0 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ******.** The fo
244c0 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20  llowing code is 
244d0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
244e0 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
244f0 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a  nly.  The code.*
24500 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64  * that follows d
24510 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
24520 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e  n normal builds.
24530 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
24540 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
24550 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20  o print out the 
24560 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f  content of all o
24570 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20  r part of a .** 
24580 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65 73  parse structures
24590 20 73 75 63 68 20 61 73 20 53 65 6c 65 63 74 20   such as Select 
245a0 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68 20 70  or Expr.  Such p
245b0 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65  rintouts are use
245c0 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69  ful.** for helpi
245d0 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64  ng to understand
245e0 20 77 68 61 74 20 69 73 20 68 61 70 70 65 6e 69   what is happeni
245f0 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f  ng inside the co
24600 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
24610 64 75 72 69 6e 67 20 74 68 65 20 65 78 65 63 75  during the execu
24620 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20  tion of complex 
24630 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24640 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  s..**.** These r
24650 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63  outine are not c
24660 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66  alled anywhere f
24670 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e  rom within the n
24680 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61  ormal.** code ba
24690 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e  se.  Then are in
246a0 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c  tended to be cal
246b0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
246c0 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20  the debugger.** 
246d0 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72  or from temporar
246e0 79 20 22 70 72 69 6e 74 66 22 20 73 74 61 74 65  y "printf" state
246f0 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66  ments inserted f
24700 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f  or debugging..*/
24710 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
24720 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b  ntExpr(Expr *p){
24730 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
24740 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
24750 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
24760 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 73 71  zToken ){.    sq
24770 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24780 28 22 28 25 73 22 2c 20 70 2d 3e 75 2e 7a 54 6f  ("(%s", p->u.zTo
24790 6b 65 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ken);.  }else{. 
247a0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
247b0 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e  rintf("(%d", p->
247c0 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  op);.  }.  if( p
247d0 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73  ->pLeft ){.    s
247e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
247f0 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  f(" ");.    sqli
24800 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
24810 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66  pLeft);.  }.  if
24820 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  ( p->pRight ){. 
24830 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24840 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20  rintf(" ");.    
24850 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
24860 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  (p->pRight);.  }
24870 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
24880 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f  rintf(")");.}.vo
24890 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45  id sqlite3PrintE
248a0 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
248b0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
248c0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
248d0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
248e0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  +){.    sqlite3P
248f0 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  rintExpr(pList->
24900 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
24910 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45   if( i<pList->nE
24920 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73  xpr-1 ){.      s
24930 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24940 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20  f(", ");.    }. 
24950 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
24960 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c  3PrintSelect(Sel
24970 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65  ect *p, int inde
24980 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65  nt){.  sqlite3De
24990 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45  bugPrintf("%*sSE
249a0 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65  LECT(%p) ", inde
249b0 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71  nt, "", p);.  sq
249c0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
249d0 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  st(p->pEList);. 
249e0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
249f0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28  ntf("\n");.  if(
24a00 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20   p->pSrc ){.    
24a10 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20  char *zPrefix;. 
24a20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50     int i;.    zP
24a30 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a  refix = "FROM";.
24a40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
24a50 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  ->pSrc->nSrc; i+
24a60 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
24a70 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24a80 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d  Item = &p->pSrc-
24a90 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c  >a[i];.      sql
24aa0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24ab0 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36  "%*s ", indent+6
24ac0 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20  , zPrefix);.    
24ad0 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a    zPrefix = "";.
24ae0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
24af0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
24b00 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24b10 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20  Printf("(\n");. 
24b20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72         sqlite3Pr
24b30 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d  intSelect(pItem-
24b40 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74  >pSelect, indent
24b50 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  +10);.        sq
24b60 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24b70 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b  ("%*s)", indent+
24b80 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65  8, "");.      }e
24b90 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  lse if( pItem->z
24ba0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
24bb0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24bc0 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  tf("%s", pItem->
24bd0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
24be0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
24bf0 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  >pTab ){.       
24c00 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24c10 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29  ntf("(table: %s)
24c20 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
24c30 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
24c40 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
24c50 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
24c60 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24c70 72 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20  rintf(" AS %s", 
24c80 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
24c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24ca0 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  ( i<p->pSrc->nSr
24cb0 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  c-1 ){.        s
24cc0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24cd0 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a  f(",");.      }.
24ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24cf0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
24d00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
24d10 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  p->pWhere ){.   
24d20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24d30 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22  ntf("%*s WHERE "
24d40 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
24d50 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
24d60 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  xpr(p->pWhere);.
24d70 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24d80 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
24d90 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  }.  if( p->pGrou
24da0 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
24db0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
24dc0 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69  *s GROUP BY ", i
24dd0 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
24de0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
24df0 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
24e00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
24e10 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
24e20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48  .  }.  if( p->pH
24e30 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c  aving ){.    sql
24e40 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24e50 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69  "%*s HAVING ", i
24e60 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
24e70 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
24e80 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  (p->pHaving);.  
24e90 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24ea0 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
24eb0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
24ec0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
24ed0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
24ee0 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64   ORDER BY ", ind
24ef0 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
24f00 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
24f10 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  st(p->pOrderBy);
24f20 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24f30 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
24f40 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74   }.}./* End of t
24f50 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62  he structure deb
24f60 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65  ug printing code
24f70 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
24f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
24fc0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
24fd0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
24fe0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
24ff0 5f 44 45 42 55 47 29 20 2a 2f 0a                 _DEBUG) */.