/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact ecd7fb2fcb8d207dd381338377b5bacce0b38a2d:


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 33  qlite3VdbeAddOp3
3a70: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3a80: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
3a90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3aa0: 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  dOp3(v, OP_Found
3ab0: 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65  , iTab, addrRepe
3ac0: 61 74 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  at, r1);.  sqlit
3ad0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3ae0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54  OP_IdxInsert, iT
3af0: 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  ab, r1);.  sqlit
3b00: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
3b10: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
3b20: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
3b30: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
3b40: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69   when a SELECT i
3b50: 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  s used within a 
3b60: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
3b70: 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49   (example:  "a I
3b80: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
3b90: 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74   table)") but it
3ba0: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31   has more than 1
3bb0: 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d   result.** colum
3bc0: 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69  n.  We do this i
3bd0: 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62  n a subroutine b
3be0: 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72  ecause the error
3bf0: 20 6f 63 63 75 72 73 20 69 6e 20 6d 75 6c 74 69   occurs in multi
3c00: 70 6c 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a  ple.** places..*
3c10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
3c20: 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
3c30: 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50  SelectError(.  P
3c40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3c50: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
3c60: 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  text. */.  Selec
3c70: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
3c80: 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f  /* Destination o
3c90: 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73  f SELECT results
3ca0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20   */.  int nExpr 
3cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3cc0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
3cd0: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
3ce0: 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a  by SELECT */.){.
3cf0: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
3d00: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66  est->eDest;.  if
3d10: 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44  ( nExpr>1 && (eD
3d20: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
3d30: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20  eDest==SRT_Set) 
3d40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
3d50: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3d60: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
3d70: 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
3d80: 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
3d90: 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
3da0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
3db0: 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
3dc0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
3dd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
3de0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3df0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
3e00: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
3e10: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
3e20: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
3e30: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
3e40: 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c   srcTab and nCol
3e50: 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72  umn are both zer
3e60: 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69  o, then the pELi
3e70: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  st expressions.*
3e80: 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  * are evaluated 
3e90: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
3ea0: 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69  the data for thi
3eb0: 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75  s row.  If nColu
3ec0: 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74  mn>0.** then dat
3ed0: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
3ee0: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
3ef0: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
3f00: 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61  to get the.** da
3f10: 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68  tatypes for each
3f20: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
3f30: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
3f40: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
3f50: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3f60: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
3f70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
3f80: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
3f90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
3fa0: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
3fb0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
3fc0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
3fd0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
3fe0: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
3ff0: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
4000: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
4010: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
4020: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
4030: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
4040: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
4050: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4060: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
4070: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
4080: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
4090: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
40a0: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73  * If not NULL, s
40b0: 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e  ort results usin
40c0: 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20  g this key */.  
40d0: 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20  int distinct,   
40e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d          /* If >=
40f0: 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73  0, make sure res
4100: 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63  ults are distinc
4110: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
4120: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
4130: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
4140: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
4150: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
4160: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
4170: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
4180: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
4190: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
41a0: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
41b0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
41c0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
41d0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
41e0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
41f0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
4200: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
4210: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
4220: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
4230: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
4240: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
4250: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4270: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
4280: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73  holding result s
4290: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  et */.  int eDes
42a0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
42b0: 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69  ;   /* How to di
42c0: 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73  spose of results
42d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
42e0: 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 20  = pDest->iParm; 
42f0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
4300: 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20  ent to disposal 
4310: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
4320: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20  nResultCol;     
4330: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4340: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
4350: 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  mns */..  assert
4360: 28 20 76 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ( v );.  if( NEV
4370: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
4380: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  n;.  assert( pEL
4390: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
43a0: 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e  istinct = distin
43b0: 63 74 3e 3d 30 3b 0a 20 20 69 66 28 20 70 4f 72  ct>=0;.  if( pOr
43c0: 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73  derBy==0 && !has
43d0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
43e0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
43f0: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d   iContinue);.  }
4400: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
4410: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
4420: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43  s..  */.  if( nC
4430: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e  olumn>0 ){.    n
4440: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c  ResultCol = nCol
4450: 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  umn;.  }else{.  
4460: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
4470: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
4480: 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  }.  if( pDest->i
4490: 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  Mem==0 ){.    pD
44a0: 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  est->iMem = pPar
44b0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
44c0: 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e 52  pDest->nMem = nR
44d0: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 50  esultCol;.    pP
44e0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
44f0: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73  esultCol;.  }els
4500: 65 7b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  e{ .    assert( 
4510: 70 44 65 73 74 2d 3e 6e 4d 65 6d 3d 3d 6e 52 65  pDest->nMem==nRe
4520: 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 7d 0a 20  sultCol );.  }. 
4530: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
4540: 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28 20  st->iMem;.  if( 
4550: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
4560: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
4570: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
4580: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4590: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
45a0: 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52   srcTab, i, regR
45b0: 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a  esult+i);.    }.
45c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
45d0: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
45e0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
45f0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
4600: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
4610: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
4620: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
4630: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
4640: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
4650: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
4660: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
4670: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
4680: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
4690: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
46a0: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
46b0: 20 72 65 67 52 65 73 75 6c 74 2c 20 65 44 65 73   regResult, eDes
46c0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a  t==SRT_Output);.
46d0: 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20    }.  nColumn = 
46e0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f  nResultCol;..  /
46f0: 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43  * If the DISTINC
4700: 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72  T keyword was pr
4710: 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c  esent on the SEL
4720: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
4730: 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20  ** and this row 
4740: 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65  has been seen be
4750: 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  fore, then do no
4760: 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a  t make this row.
4770: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
4780: 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
4790: 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20  if( hasDistinct 
47a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
47b0: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
47c0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e  assert( pEList->
47d0: 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29  nExpr==nColumn )
47e0: 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e  ;.    codeDistin
47f0: 63 74 28 70 50 61 72 73 65 2c 20 64 69 73 74 69  ct(pParse, disti
4800: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
4810: 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75  nColumn, regResu
4820: 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  lt);.    if( pOr
4830: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
4840: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
4850: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  p, iContinue);. 
4860: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
4870: 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
4880: 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
4890: 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
48a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
48b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
48c0: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
48d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
48e0: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
48f0: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
4900: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
4910: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
4920: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
4930: 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
4940: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
4950: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20  OUND_SELECT.    
4960: 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20  case SRT_Union: 
4970: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
4980: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
4990: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
49a0: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
49b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
49c0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
49d0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
49e0: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  mn, r1);.      s
49f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4a00: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
4a10: 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  , iParm, r1);.  
4a20: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
4a30: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
4a40: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
4a50: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
4a60: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
4a70: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
4a80: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
4a90: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
4aa0: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
4ab0: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
4ac0: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
4ad0: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
4ae0: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
4af0: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
4b00: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4b10: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
4b20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4b30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44  ddOp3(v, OP_IdxD
4b40: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65  elete, iParm, re
4b50: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
4b60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4b70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
4b80: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
4b90: 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
4ba0: 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
4bb0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4bc0: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
4bd0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
4be0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
4bf0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
4c00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
4c10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4c20: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
4c30: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
4c40: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
4c50: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
4c60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c70: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4c80: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
4c90: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
4ca0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4cb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
4cc0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
4cd0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
4ce0: 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r1);.      }else
4cf0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
4d00: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
4d10: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
4d20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
4d40: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
4d50: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
4d60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4d70: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
4d80: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
4d90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4da0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
4db0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
4dc0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4dd0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4de0: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
4df0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
4e00: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
4e10: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
4e20: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
4e30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
4e40: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
4e50: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
4e60: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
4e70: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
4e80: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
4e90: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
4ea0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
4eb0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
4ec0: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
4ed0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
4ee0: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
4ef0: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
4f00: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
4f10: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
4f20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
4f30: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
4f40: 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20    p->affinity = 
4f50: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
4f60: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
4f70: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
4f80: 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20  ->affinity);.   
4f90: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4fa0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
4fb0: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
4fc0: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
4fd0: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
4fe0: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
4ff0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
5000: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
5010: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
5020: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
5030: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
5040: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
5050: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
5060: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
5070: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
5080: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
5090: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
50a0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
50b0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
50c0: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67  pOrderBy, p, reg
50d0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
50e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
50f0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5100: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5110: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5120: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
5130: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5140: 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20  gResult, 1, r1, 
5150: 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
5160: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5170: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
5180: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
5190: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
51a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
51b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
51c0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
51d0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
51e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
51f0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5210: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5220: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
5230: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
5240: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
5250: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
5260: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
5270: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
5280: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5290: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
52a0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
52b0: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
52c0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
52d0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
52e0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
52f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5300: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
5310: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
5320: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
5330: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
5340: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
5350: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
5360: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
5370: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
5380: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
5390: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
53a0: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
53b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
53c0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
53d0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
53e0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
53f0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
5400: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
5410: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
5420: 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  p, regResult);. 
5430: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
5450: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
5460: 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d  regResult, iParm
5470: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  , 1);.        /*
5480: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
5490: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
54a0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
54b0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
54c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
54d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
54e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
54f0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
5500: 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61  /* Send the data
5510: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
5520: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20   function or to 
5530: 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49  a subroutine.  I
5540: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73  n the.    ** cas
5550: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
5560: 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  e, the subroutin
5570: 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70  e itself is resp
5580: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20  onsible for.    
5590: 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64  ** popping the d
55a0: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ata from the sta
55b0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ck..    */.    c
55c0: 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
55d0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
55e0: 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20  Output: {.      
55f0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
5600: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
5610: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5620: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
5630: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  put );.      if(
5640: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
5650: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
5660: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5670: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
5680: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5690: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
56a0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
56b0: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
56c0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
56d0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
56e0: 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20  derBy, p, r1);. 
56f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
5700: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
5710: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
5720: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
5730: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
5740: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5750: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5760: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
5770: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
5780: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5790: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
57a0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
57b0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
57c0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
57d0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
57e0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
57f0: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  se, regResult, n
5800: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
5810: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5820: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
5830: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
5840: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
5850: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
5860: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
5870: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
5880: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
5890: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
58a0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
58b0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
58c0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
58d0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
58e0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
58f0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
5900: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
5910: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
5920: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
5930: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
5940: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
5950: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5960: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
5970: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
5980: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5990: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
59a0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
59b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
59c0: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
59d0: 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
59e0: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
59f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5a00: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 20 20  pOrderBy==0 );  
5a10: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
5a20: 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
5a30: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  call to.        
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 2a 2a 20 70 75 73 68 4f 6e 74 6f 53      ** pushOntoS
5a60: 6f 72 74 65 72 28 29 20 77 6f 75 6c 64 20 68 61  orter() would ha
5a70: 76 65 20 63 6c 65 61 72 65 64 20 70 2d 3e 69 4c  ve cleared p->iL
5a80: 69 6d 69 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  imit */.    sqli
5a90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5aa0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
5ab0: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
5ac0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ad0: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
5ae0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
5af0: 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
5b00: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
5b10: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
5b20: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
5b30: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
5b40: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
5b50: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
5b60: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
5b70: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
5b80: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
5b90: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
5ba0: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
5bb0: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
5bc0: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
5bd0: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
5be0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
5bf0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
5c00: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
5c10: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
5c20: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
5c30: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
5c40: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
5c50: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
5c60: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
5c70: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5c80: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
5c90: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
5ca0: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
5cb0: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
5cc0: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
5cd0: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
5ce0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
5cf0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5d00: 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20   is obtain from 
5d10: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
5d20: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
5d30: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5d40: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
5d50: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
5d60: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
5d70: 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20  freed.  Add the 
5d80: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5d90: 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c  e to the P4 fiel
5da0: 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75  d of an opcode u
5db0: 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e  sing.** P4_KEYIN
5dc0: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68  FO_HANDOFF is th
5dd0: 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64  e usual way of d
5de0: 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73  ealing with this
5df0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
5e00: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
5e10: 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a  ExprList(Parse *
5e20: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
5e30: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pList){.  sqli
5e40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5e50: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ->db;.  int nExp
5e60: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
5e70: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
5e80: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
5e90: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  em;.  int i;..  
5ea0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
5eb0: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
5ec0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
5ed0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
5ee0: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
5ef0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
5f00: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
5f10: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
5f20: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
5f30: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
5f40: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
5f50: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  fo->nField = (u1
5f60: 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e  6)nExpr;.    pIn
5f70: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
5f80: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64 62  );.    pInfo->db
5f90: 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69   = db;.    for(i
5fa0: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
5fb0: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
5fc0: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
5fd0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
5fe0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
5ff0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
6000: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
6010: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
6020: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
6030: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
6040: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
6050: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f     }.      pInfo
6060: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
6070: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
6080: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
6090: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
60a0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
60b0: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
60c0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
60d0: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
60e0: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
60f0: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
6100: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
6110: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
6120: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
6130: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
6140: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
6150: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
6160: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
6170: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
6180: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
6190: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
61a0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
61b0: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
61c0: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
61d0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
61e0: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
61f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6200: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
6210: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
6220: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
6230: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6240: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20  t */.  Vdbe *v, 
6250: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
6260: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
6270: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  his VDBE */.  in
6280: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
6290: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
62a0: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
62b0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
62c0: 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65  est /* Write the
62d0: 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20   sorted results 
62e0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
62f0: 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
6300: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
6310: 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d  l(v);     /* Jum
6320: 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c  p here to exit l
6330: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
6340: 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  rContinue = sqli
6350: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
6360: 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65  (v);  /* Jump he
6370: 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c  re for next cycl
6380: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  e */.  int addr;
6390: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69  .  int iTab;.  i
63a0: 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30  nt pseudoTab = 0
63b0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
63c0: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
63d0: 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65  erBy;..  int eDe
63e0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
63f0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
6400: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a   pDest->iParm;..
6410: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
6420: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20  int regRowid;.. 
6430: 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79   iTab = pOrderBy
6440: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65  ->iECursor;.  re
6450: 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65  gRow = sqlite3Ge
6460: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6470: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
6480: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
6490: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
64a0: 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54  e ){.    pseudoT
64b0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
64c0: 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b++;.    sqlite3
64d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
64e0: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65  _OpenPseudo, pse
64f0: 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20  udoTab, regRow, 
6500: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65  nColumn);.    re
6510: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65  gRowid = 0;.  }e
6520: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
6530: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
6540: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6550: 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20   }.  addr = 1 + 
6560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6570: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54  2(v, OP_Sort, iT
6580: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
6590: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
65a0: 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  p, addrContinue)
65b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
65c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
65d0: 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72  mn, iTab, pOrder
65e0: 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 72  By->nExpr + 1, r
65f0: 65 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63 68  egRow);.  switch
6600: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
6610: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
6620: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
6630: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65  mTab: {.      te
6640: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6650: 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
6660: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
6670: 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
6680: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6690: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
66a0: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
66b0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
66c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
66d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
66e0: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
66f0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
6700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
6710: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
6720: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
6730: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
6740: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6750: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
6760: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
6770: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6780: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
67a0: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
67b0: 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72  rd, regRow, 1, r
67c0: 65 67 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66  egRowid, &p->aff
67d0: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
67e0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
67f0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
6800: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
6810: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
6820: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6830: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
6840: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
6850: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6860: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  }.    case SRT_M
6870: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
6880: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
6890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
68a0: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
68b0: 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72  se, regRow, iPar
68c0: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
68d0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
68e0: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
68f0: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
6900: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
6910: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6920: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6930: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61    int i;.      a
6940: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
6950: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
6960: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6970: 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63   ); .      testc
6980: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
6990: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
69a0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
69b0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
69c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
69d0: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
69e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
69f0: 28 20 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d  ( regRow!=pDest-
6a00: 3e 69 4d 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20  >iMem+i );.     
6a10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6a20: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
6a30: 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c  n, pseudoTab, i,
6a40: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b   pDest->iMem+i);
6a50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
6a60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
6a70: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6a80: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45  P5(v, OPFLAG_CLE
6a90: 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20  ARCACHE);.      
6aa0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6ab0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
6ac0: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
6ad0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6ae0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
6af0: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65  tRow, pDest->iMe
6b00: 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  m, nColumn);.   
6b10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6b20: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
6b30: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73  nge(pParse, pDes
6b40: 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e  t->iMem, nColumn
6b50: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6b60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6b70: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6b80: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50  Yield, pDest->iP
6b90: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
6ba0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6bb0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
6bc0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6bd0: 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  rse, regRow);.  
6be0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
6bf0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
6c00: 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 4c  gRowid);..  /* L
6c10: 49 4d 49 54 20 68 61 73 20 62 65 65 6e 20 69 6d  IMIT has been im
6c20: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65  plemented by the
6c30: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
6c40: 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  ) routine..  */.
6c50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4c 69    assert( p->iLi
6c60: 6d 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  mit==0 );..  /* 
6c70: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
6c80: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
6c90: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
6ca0: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
6cb0: 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
6cc0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6cd0: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
6ce0: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr);.  sqlite3Vd
6cf0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
6d00: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
6d10: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
6d20: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
6d30: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
6d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6d50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
6d60: 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30  se, pseudoTab, 0
6d70: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6d80: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6d90: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
6da0: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
6db0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
6dc0: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
6dd0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
6de0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
6df0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
6e00: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
6e10: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
6e20: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
6e30: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
6e40: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
6e50: 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ted from the.** 
6e60: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
6e70: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
6e80: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
6e90: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54  n is a column. T
6ea0: 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  he.** declaratio
6eb0: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
6ec0: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
6ed0: 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65  GER. Exactly whe
6ee0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
6ef0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
6f00: 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65   a column can be
6f10: 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20   complex in the 
6f20: 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71  presence of subq
6f30: 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72  ueries. The.** r
6f40: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
6f50: 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74  sion in all of t
6f60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
6f70: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
6f80: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
6f90: 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69   a column by thi
6fa0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
6fb0: 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46  *   SELECT col F
6fc0: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
6fd0: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
6fe0: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
6ff0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
7000: 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  ol FROM tbl);.**
7010: 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52     SELECT abc FR
7020: 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41  OM (SELECT col A
7030: 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b  S abc FROM tbl);
7040: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
7050: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
7060: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
7070: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c  other than a col
7080: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  umn is NULL..*/.
7090: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
70a0: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20  r *columnType(. 
70b0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
70c0: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
70d0: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
70e0: 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20  **pzOriginDb,.  
70f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
7100: 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73  riginTab,.  cons
7110: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
7120: 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63  nCol.){.  char c
7130: 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b  onst *zType = 0;
7140: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
7150: 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20  OriginDb = 0;.  
7160: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
7170: 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  ginTab = 0;.  ch
7180: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
7190: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nCol = 0;.  int 
71a0: 6a 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  j;.  if( NEVER(p
71b0: 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d  Expr==0) || pNC-
71c0: 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72  >pSrcList==0 ) r
71d0: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74  eturn 0;..  swit
71e0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
71f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
7200: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
7210: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
7220: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
7230: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
7240: 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74  mn. Locate the t
7250: 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  able the column 
7260: 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a  is being.      *
7270: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
7280: 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e   in NameContext.
7290: 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74  pSrcList. This t
72a0: 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c  able may be real
72b0: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
72c0: 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75  se table or a su
72d0: 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f  bquery..      */
72e0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
72f0: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
7300: 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75     /* Table stru
7310: 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20  cture column is 
7320: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
7330: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
7340: 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pS = 0;         
7350: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68      /* Select th
7360: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
7370: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
7380: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
7390: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20  Expr->iColumn;  
73a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
73b0: 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20  mn in pTab */.  
73c0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
73d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
73e0: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
73f0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
7400: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
7410: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
7420: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
7430: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
7440: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
7450: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
7460: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
7470: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
7480: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
7490: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
74a0: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
74b0: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
74c0: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
74d0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
74e0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
74f0: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
7500: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
7510: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
7520: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7530: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
7540: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7550: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
7560: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
7570: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65    /* At one time
7580: 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22  , code such as "
7590: 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69  SELECT new.x" wi
75a0: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77  thin a trigger w
75b0: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
75c0: 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69  cause this condi
75d0: 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69  tion to run.  Si
75e0: 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76  nce then, we hav
75f0: 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68  e restructured h
7600: 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  ow.        ** tr
7610: 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65  igger code is ge
7620: 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74  nerated and so t
7630: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
7640: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
7650: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
7660: 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   However, it can
7670: 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66   still be true f
7680: 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  or statements li
7690: 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ke.        ** th
76a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
76b0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
76c0: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
76d0: 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52  E t1(col INTEGER
76e0: 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  );.        **   
76f0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74  SELECT (SELECT t
7700: 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d  1.col) FROM FROM
7710: 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a   t1;.        **.
7720: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
7730: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
7740: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
7750: 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c  pression "t1.col
7760: 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  " in the .      
7770: 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e    ** sub-select.
7780: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
7790: 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  et the column ty
77a0: 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e  pe to NULL, even
77b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75  .        ** thou
77c0: 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61  gh it should rea
77d0: 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22  lly be "INTEGER"
77e0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
77f0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
7800: 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61  not a problem, a
7810: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  s the column typ
7820: 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73  e of "t1.col" is
7830: 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a   never.        *
7840: 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c  * used. When col
7850: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
7860: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
7870: 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ssion .        *
7880: 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  * "(SELECT t1.co
7890: 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74  l)", the correct
78a0: 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65   type is returne
78b0: 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45  d (see the TK_SE
78c0: 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20  LECT.        ** 
78d0: 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a  branch below.  *
78e0: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
78f0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7900: 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
7910: 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61  pExpr->pTab==pTa
7920: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
7930: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
7940: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
7950: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
7960: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
7970: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
7980: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
7990: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
79a0: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
79b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
79c0: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
79d0: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
79e0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
79f0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
7a00: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
7a10: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
7a20: 20 41 4c 57 41 59 53 28 69 43 6f 6c 3e 3d 30 20   ALWAYS(iCol>=0 
7a30: 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  && iCol<pS->pELi
7a40: 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
7a50: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43          /* If iC
7a60: 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ol is less than 
7a70: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65  zero, then the e
7a80: 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73  xpression reques
7a90: 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ts the.         
7aa0: 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65   ** rowid of the
7ab0: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
7ac0: 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73  iew. This expres
7ad0: 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73  sion is legal (s
7ae0: 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ee .          **
7af0: 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32   test case misc2
7b00: 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79  .2.2) - it alway
7b10: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  s evaluates to N
7b20: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ULL..          *
7b30: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
7b40: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
7b50: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
7b60: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
7b70: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
7b80: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
7b90: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
7ba0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
7bb0: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
7bc0: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
7bd0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
7be0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7bf0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
7c00: 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20   p, &zOriginDb, 
7c10: 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f  &zOriginTab, &zO
7c20: 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20  riginCol); .    
7c30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
7c40: 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61  e if( ALWAYS(pTa
7c50: 62 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20  b->pSchema) ){. 
7c60: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
7c70: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
7c80: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
7c90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7ca0: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
7cb0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
7cc0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
7cd0: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
7ce0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
7cf0: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
7d00: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
7d10: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
7d20: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
7d30: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
7d40: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20  "rowid";.       
7d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7d60: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
7d70: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
7d80: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7d90: 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  ginCol = pTab->a
7da0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
7db0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7dc0: 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20     zOriginTab = 
7dd0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
7de0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
7df0: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
7e00: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
7e10: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
7e20: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
7e30: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
7e40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7e50: 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  ginDb = pNC->pPa
7e60: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
7e70: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7e80: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7e90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
7ea0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7eb0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
7ec0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
7ed0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
7ee0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
7ef0: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
7f00: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7f10: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
7f20: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
7f30: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
7f40: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
7f50: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
7f60: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
7f70: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
7f80: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
7f90: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
7fa0: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
7fb0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
7fc0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
7fd0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
7fe0: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
7ff0: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
8000: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
8010: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
8020: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
8030: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
8040: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
8050: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72  ;.      sNC.pPar
8060: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
8070: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
8080: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
8090: 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20   p, &zOriginDb, 
80a0: 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f  &zOriginTab, &zO
80b0: 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20  riginCol); .    
80c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
80d0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69  endif.  }.  .  i
80e0: 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b  f( pzOriginDb ){
80f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f  .    assert( pzO
8100: 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72  riginTab && pzOr
8110: 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  iginCol );.    *
8120: 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72  pzOriginDb = zOr
8130: 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f  iginDb;.    *pzO
8140: 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67  riginTab = zOrig
8150: 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  inTab;.    *pzOr
8160: 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69  iginCol = zOrigi
8170: 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nCol;.  }.  retu
8180: 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
8190: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
81a0: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
81b0: 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63  the VDBE the dec
81c0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f  laration types o
81d0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
81e0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
81f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
8200: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
8210: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
8220: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
8230: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
8240: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
8250: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
8260: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
8270: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
8280: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
8290: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
82a0: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  lt set */.){.#if
82b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
82c0: 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65  _DECLTYPE.  Vdbe
82d0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
82e0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
82f0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
8300: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
8310: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e  = pTabList;.  sN
8320: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
8330: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
8340: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
8350: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
8360: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
8370: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74  pExpr;.    const
8380: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69   char *zType;.#i
8390: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
83a0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
83b0: 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  TA.    const cha
83c0: 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  r *zOrigDb = 0;.
83d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
83e0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
83f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8400: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rigCol = 0;.    
8410: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
8420: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
8430: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
8440: 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20   &zOrigCol);..  
8450: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
8460: 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20  st make its own 
8470: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
8480: 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65  mn-type and othe
8490: 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  r .    ** column
84a0: 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67   specific string
84b0: 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
84c0: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
84d0: 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a  efore this.    *
84e0: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
84f0: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
8500: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
8510: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8520: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
8530: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
8540: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8550: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8560: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8570: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
8580: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49  , zOrigTab, SQLI
8590: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
85a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
85b0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
85c0: 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a  OLNAME_COLUMN, z
85d0: 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  OrigCol, SQLITE_
85e0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73  TRANSIENT);.#els
85f0: 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  e.    zType = co
8600: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
8610: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
8620: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
8630: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8640: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
8650: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
8660: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
8670: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8680: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
8690: 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  E */.}../*.** Ge
86a0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
86b0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
86c0: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
86d0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
86e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
86f0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
8700: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
8710: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
8720: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
8730: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
8740: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
8750: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
8760: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8770: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
8780: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
8790: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
87a0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
87b0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
87c0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
87d0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
87e0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
87f0: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
8800: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8810: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
8820: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8830: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
8840: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
8850: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
8860: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
8870: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
8880: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
8890: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
88a0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
88b0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
88c0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
88d0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  if..  if( pParse
88e0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
88f0: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20   NEVER(v==0) || 
8900: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8910: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61   ) return;.  pPa
8920: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
8930: 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65   = 1;.  fullName
8940: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
8950: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
8960: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72  ames)!=0;.  shor
8970: 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  tNames = (db->fl
8980: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
8990: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  rtColNames)!=0;.
89a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
89b0: 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
89c0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
89d0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
89e0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
89f0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20   Expr *p;.    p 
8a00: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
8a10: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45  Expr;.    if( NE
8a20: 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74  VER(p==0) ) cont
8a30: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45  inue;.    if( pE
8a40: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8a50: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
8a60: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
8a70: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
8a80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8a90: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8aa0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8ab0: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
8ac0: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
8ad0: 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( (p->op==TK_C
8ae0: 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  OLUMN || p->op==
8af0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26  TK_AGG_COLUMN) &
8b00: 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  & pTabList ){.  
8b10: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8b20: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
8b30: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
8b40: 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
8b50: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41        for(j=0; A
8b60: 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74  LWAYS(j<pTabList
8b70: 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20  ->nSrc); j++){. 
8b80: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c         if( pTabL
8b90: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
8ba0: 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62  r==p->iTable ) b
8bb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8bc0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
8bd0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
8be0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
8bf0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
8c00: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
8c10: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
8c20: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
8c30: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
8c40: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
8c50: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
8c60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
8c70: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
8c80: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
8c90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8ca0: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
8cb0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
8cc0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
8cd0: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
8ce0: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29   && !fullNames )
8cf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8d00: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8d10: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8d20: 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ME, .           
8d30: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8d40: 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  (db, pEList->a[i
8d50: 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45  ].zSpan), SQLITE
8d60: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8d70: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
8d80: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
8d90: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
8da0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
8db0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8dc0: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
8dd0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b  b->zName, zCol);
8de0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8df0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8e00: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8e10: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
8e20: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8e30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8e40: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8e50: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8e60: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
8e70: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8e80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8e90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8ea0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8eb0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8ec0: 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20  NAME, .         
8ed0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8ee0: 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  (db, pEList->a[i
8ef0: 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45  ].zSpan), SQLITE
8f00: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
8f10: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
8f20: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
8f30: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
8f40: 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ist);.}..#ifndef
8f50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
8f60: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
8f70: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
8f80: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
8f90: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
8fa0: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
8fb0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
8fc0: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
8fd0: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
8fe0: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
8ff0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
9000: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
9010: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
9020: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9030: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
9040: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
9050: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9060: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
9070: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
9080: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
9090: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
90a0: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
90b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
90c0: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
90d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
90e0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
90f0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
9100: 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  a an expression 
9110: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
9120: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
9130: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
9140: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
9150: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
9160: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
9170: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
9180: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
9190: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
91a0: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
91b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
91c0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
91d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
91e0: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
91f0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
9200: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
9210: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
9220: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
9230: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
9240: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
9250: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
9260: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
9270: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
9280: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
9290: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
92a0: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
92b0: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
92c0: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
92d0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
92e0: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
92f0: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
9300: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
9310: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9320: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
9330: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9340: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9350: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
9360: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
9370: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
9380: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
9390: 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  nt *pnCol,      
93a0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
93b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
93c0: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
93d0: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
93e0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
93f0: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
9400: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
9410: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9420: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
9430: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9440: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
9450: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
9460: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9470: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
9480: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
9490: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
94a0: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
94b0: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
94c0: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
94d0: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
94e0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
94f0: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
9500: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
9510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9520: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9530: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
9540: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
9550: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
9560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9570: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
9580: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
9590: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
95a0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
95b0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
95c0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
95d0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
95e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
95f0: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
9600: 20 2a 2f 0a 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20   */..  *pnCol = 
9610: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
9620: 45 78 70 72 3b 0a 20 20 61 43 6f 6c 20 3d 20 2a  Expr;.  aCol = *
9630: 70 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44  paCol = sqlite3D
9640: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
9650: 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
9660: 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 61 43 6f  nCol);.  if( aCo
9670: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
9680: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f  LITE_NOMEM;.  fo
9690: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
96a0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
96b0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47  Col++){.    /* G
96c0: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
96d0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
96e0: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
96f0: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
9700: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
9710: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
9720: 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  0 || ExprHasProp
9730: 65 72 74 79 28 70 2d 3e 70 52 69 67 68 74 2c 20  erty(p->pRight, 
9740: 45 50 5f 49 6e 74 56 61 6c 75 65 29 0a 20 20 20  EP_IntValue).   
9750: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
9760: 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  ->pRight->u.zTok
9770: 65 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  en==0 || p->pRig
9780: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  ht->u.zToken[0]!
9790: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
97a0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
97b0: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
97c0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
97d0: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
97e0: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
97f0: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
9800: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
9810: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
9820: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9830: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
9840: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
9850: 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b  r *pColExpr = p;
9860: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
9870: 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20  ion that is the 
9880: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61  result column na
9890: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c  me */.      Tabl
98a0: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
98b0: 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69   /* Table associ
98c0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65  ated with this e
98d0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
98e0: 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78     while( pColEx
98f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pr->op==TK_DOT )
9900: 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c   pColExpr = pCol
9910: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
9920: 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72      if( pColExpr
9930: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
9940: 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78  && ALWAYS(pColEx
9950: 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  pr->pTab!=0) ){.
9960: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63          /* For c
9970: 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63  olumns use the c
9980: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20  olumn name name 
9990: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
99a0: 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Col = pColExpr->
99b0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
99c0: 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72   pTab = pColExpr
99d0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
99e0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
99f0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
9a00: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
9a10: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9a20: 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20  db, "%s",.      
9a30: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e             iCol>
9a40: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
9a50: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
9a60: 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65  owid");.      }e
9a70: 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72  lse if( pColExpr
9a80: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
9a90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9aa0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9ab0: 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74  pColExpr, EP_Int
9ac0: 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
9ad0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
9ae0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
9af0: 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a  ", pColExpr->u.z
9b00: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
9b10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
9b20: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
9b30: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
9b40: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
9b50: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
9b60: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
9b70: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
9b80: 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61   "%s", pEList->a
9b90: 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [i].zSpan);.    
9ba0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9bb0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
9bc0: 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
9bd0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
9be0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
9bf0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
9c00: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
9c10: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
9c20: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
9c30: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
9c40: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
9c50: 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  a integer to the
9c60: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
9c70: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
9c80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
9c90: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
9ca0: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
9cb0: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
9cc0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
9cd0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
9ce0: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
9cf0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
9d00: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e       char *zNewN
9d10: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ame;.        zNa
9d20: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
9d30: 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20         zNewName 
9d40: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9d50: 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e  (db, "%s:%d", zN
9d60: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
9d70: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9d80: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
9d90: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a         zName = z
9da0: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
9db0: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
9dc0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
9dd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9de0: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
9df0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
9e00: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
9e10: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
9e20: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
9e30: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
9e40: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
9e50: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
9e60: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
9e70: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
9e80: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
9e90: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
9ea0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9eb0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
9ec0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
9ee0: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
9ef0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
9f00: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
9f10: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
9f20: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
9f30: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
9f40: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
9f50: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
9f60: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
9f70: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
9f80: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
9f90: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
9fa0: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
9fb0: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
9fc0: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
9fd0: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
9fe0: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
9ff0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
a000: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
a010: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
a020: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
a030: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
a040: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
a050: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
a060: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
a070: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
a080: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a090: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
a0a0: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
a0b0: 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20   int nCol,      
a0c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a0d0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
a0e0: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20   Column *aCol,  
a0f0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
a100: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53  f columns */.  S
a110: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
a120: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75       /* SELECT u
a130: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
a140: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
a150: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  tions */.){.  sq
a160: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a170: 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f  se->db;.  NameCo
a180: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c  ntext sNC;.  Col
a190: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c  umn *pCol;.  Col
a1a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
a1b0: 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b  nt i;.  Expr *p;
a1c0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
a1d0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61  st_item *a;..  a
a1e0: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d  ssert( pSelect!=
a1f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
a200: 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
a210: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29  s & SF_Resolved)
a220: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a230: 20 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e   nCol==pSelect->
a240: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c  pEList->nExpr ||
a250: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a260: 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  d );.  if( db->m
a270: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
a280: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
a290: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
a2a0: 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63  NC));.  sNC.pSrc
a2b0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
a2c0: 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c  pSrc;.  a = pSel
a2d0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a  ect->pEList->a;.
a2e0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
a2f0: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  aCol; i<nCol; i+
a300: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
a310: 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  p = a[i].pExpr;.
a320: 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20      pCol->zType 
a330: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a340: 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65  p(db, columnType
a350: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
a360: 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  0));.    pCol->a
a370: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
a380: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
a390: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  ;.    if( pCol->
a3a0: 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
a3b0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
a3c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
a3d0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
a3e0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
a3f0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
a400: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
a410: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
a420: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
a430: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
a440: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a450: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45  /*.** Given a SE
a460: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
a470: 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65  generate a Table
a480: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
a490: 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65  describes.** the
a4a0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
a4b0: 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54  hat SELECT..*/.T
a4c0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73  able *sqlite3Res
a4d0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
a4e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
a4f0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
a500: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
a510: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a520: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
a530: 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20   savedFlags;..  
a540: 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d  savedFlags = db-
a550: 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c  >flags;.  db->fl
a560: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46  ags &= ~SQLITE_F
a570: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64  ullColNames;.  d
a580: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
a590: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
a5a0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
a5b0: 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53  tPrep(pParse, pS
a5c0: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
a5d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
a5e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c  return 0;.  whil
a5f0: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
a600: 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70  or ) pSelect = p
a610: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
a620: 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61    db->flags = sa
a630: 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62  vedFlags;.  pTab
a640: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a650: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
a660: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
a670: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
a680: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a690: 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52   /* The sqlite3R
a6a0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
a6b0: 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  () is only used 
a6c0: 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65  n contexts where
a6d0: 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20   lookaside.  ** 
a6e0: 69 73 20 64 69 73 61 62 6c 65 64 2c 20 73 6f 20  is disabled, so 
a6f0: 77 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c  we might as well
a700: 20 68 61 72 64 2d 63 6f 64 65 20 70 54 61 62 2d   hard-code pTab-
a710: 3e 64 62 4d 65 6d 20 74 6f 20 4e 55 4c 4c 2e 20  >dbMem to NULL. 
a720: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
a730: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
a740: 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62  led==0 );.  pTab
a750: 2d 3e 64 62 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  ->dbMem = 0;.  p
a760: 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
a770: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
a780: 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  ;.  selectColumn
a790: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
a7a0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
a7b0: 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
a7c0: 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
a7d0: 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  ;.  selectAddCol
a7e0: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
a7f0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
a800: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43  ->nCol, pTab->aC
a810: 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  ol, pSelect);.  
a820: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
a830: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
a840: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a850: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
a860: 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20 72 65  le(pTab);.    re
a870: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
a880: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
a890: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
a8a0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
a8b0: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
a8c0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
a8d0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
a8e0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
a8f0: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
a900: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
a910: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
a920: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
a930: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
a940: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
a950: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a960: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
a970: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
a980: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
a990: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
a9a0: 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53  ->db);.#ifndef S
a9b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
a9c0: 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20  .    if( v ){.  
a9d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a9e0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63  ddOp0(v, OP_Trac
a9f0: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
aa00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
aa10: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
aa20: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
aa30: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
aa40: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
aa50: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
aa60: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
aa70: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
aa80: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
aa90: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
aaa0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
aab0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
aac0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
aad0: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
aae0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
aaf0: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
ab00: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
ab10: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
ab20: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
ab30: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
ab40: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
ab50: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
ab60: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
ab70: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
ab80: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
ab90: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
aba0: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
abb0: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
abc0: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
abd0: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
abe0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
abf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
ac00: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
ac10: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
ac20: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
ac30: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
ac40: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
ac50: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
ac60: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
ac70: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
ac80: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
ac90: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
aca0: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
acb0: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
acc0: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
acd0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
ace0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
acf0: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
ad00: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
ad10: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
ad20: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
ad30: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
ad40: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
ad50: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
ad60: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
ad70: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
ad80: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
ad90: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
ada0: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
adb0: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
adc0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
add0: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
ade0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
adf0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
ae00: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
ae10: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
ae20: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
ae30: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
ae40: 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72  fset;.  int addr
ae50: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  1;.  if( p->iLim
ae60: 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  it ) return;..  
ae70: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
ae80: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
ae90: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
aea0: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
aeb0: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
aec0: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
aed0: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
aee0: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
aef0: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
af00: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
af10: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
af20: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
af30: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
af40: 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
af50: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
af60: 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c   p->pOffset==0 |
af70: 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  | p->pLimit!=0 )
af80: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  ;.  if( p->pLimi
af90: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
afa0: 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
afb0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
afc0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
afd0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
afe0: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
aff0: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
b000: 56 44 42 45 20 73 68 6f 75 6c 64 20 68 61 76 65  VDBE should have
b010: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
b020: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 73  located */.    s
b030: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b040: 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
b050: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  , iLimit);.    s
b060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b070: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
b080: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 56  , iLimit);.    V
b090: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
b0a0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
b0b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b0c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
b0d0: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42  Zero, iLimit, iB
b0e0: 72 65 61 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  reak);.    if( p
b0f0: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
b100: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
b110: 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
b120: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
b130: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
b140: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
b150: 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
b160: 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
b170: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
b180: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b190: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
b1a0: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
b1b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b1c0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
b1d0: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
b1e0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
b1f0: 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
b200: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
b210: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b220: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
b230: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
b240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b250: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
b260: 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a  r, 0, iOffset);.
b270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b280: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
b290: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
b2a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b2b0: 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20  OP_Add, iLimit, 
b2c0: 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  iOffset, iOffset
b2d0: 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +1);.      VdbeC
b2e0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
b2f0: 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20  T+OFFSET"));.   
b300: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
b310: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b320: 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74  OP_IfPos, iLimit
b330: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b340: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b350: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f  _Integer, -1, iO
b360: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
b370: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b380: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
b390: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
b3a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b3b0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
b3c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
b3d0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
b3e0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
b3f0: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
b400: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
b410: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
b420: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
b430: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
b440: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
b450: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
b460: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
b470: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
b480: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
b490: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
b4a0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
b4b0: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
b4c0: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
b4d0: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
b4e0: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
b4f0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
b500: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
b510: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
b520: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
b530: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
b540: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
b550: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
b560: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
b570: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
b580: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
b590: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
b5a0: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
b5b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
b5c0: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
b5d0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
b5e0: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26  .  if( pRet==0 &
b5f0: 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  & iCol<p->pEList
b600: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ->nExpr ){.    p
b610: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
b620: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
b630: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
b640: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
b650: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
b660: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b670: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
b680: 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f  SELECT */../* Fo
b690: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
b6a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
b6b0: 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
b6c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b6d0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
b6e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b6f0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
b700: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
b710: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
b720: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
b730: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
b740: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
b750: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
b760: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
b770: 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  );...#ifndef SQL
b780: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b790: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54  D_SELECT./*.** T
b7a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b7b0: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
b7c0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
b7d0: 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74  y form from.** t
b7e0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
b7f0: 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e  ate queries usin
b800: 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41  g UNION, UNION A
b810: 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a  LL, EXCEPT, or.*
b820: 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a  * INTERSECT.**.*
b830: 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
b840: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
b850: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
b860: 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
b870: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
b880: 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
b890: 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
b8a0: 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
b8b0: 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
b8c0: 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
b8d0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
b8e0: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
b8f0: 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
b900: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
b910: 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
b920: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b930: 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
b940: 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
b950: 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
b960: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
b970: 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
b980: 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
b990: 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
b9a0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
b9b0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
b9c0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
b9d0: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
b9e0: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
b9f0: 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
ba00: 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
ba10: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
ba20: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
ba30: 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
ba40: 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
ba50: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
ba60: 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
ba70: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
ba80: 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
ba90: 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
baa0: 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
bab0: 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
bac0: 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
bad0: 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
bae0: 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
baf0: 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
bb00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
bb10: 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
bb20: 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
bb30: 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
bb40: 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
bb50: 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
bb60: 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
bb70: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
bb80: 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
bb90: 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
bba0: 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
bbb0: 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
bbc0: 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
bbd0: 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
bbe0: 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
bbf0: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
bc00: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
bc10: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
bc20: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
bc30: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bc40: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
bc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
bc60: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
bc70: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
bc80: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
bc90: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
bca0: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
bcb0: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
bcc0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
bcd0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
bce0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
bcf0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
bd00: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
bd10: 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
bd20: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
bd30: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
bd40: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd60: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
bd70: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
bd80: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
bd90: 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  ;      /* Altern
bda0: 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69  ative data desti
bdb0: 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  nation */.  Sele
bdc0: 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b  ct *pDelete = 0;
bdd0: 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69    /* Chain of si
bde0: 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20  mple selects to 
bdf0: 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69  delete */.  sqli
be00: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
be10: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
be20: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  nnection */..  /
be30: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
be40: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
be50: 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
be60: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
be70: 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
be80: 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
be90: 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
bea0: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
beb0: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
bec0: 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61   LIMIT..  */.  a
bed0: 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
bee0: 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c  Prior );  /* Cal
bef0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75  ling function gu
bf00: 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75  arantees this mu
bf10: 63 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  ch */.  db = pPa
bf20: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f  rse->db;.  pPrio
bf30: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
bf40: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
bf50: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72  >pRightmost!=pPr
bf60: 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ior );.  assert(
bf70: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
bf80: 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f  ost==p->pRightmo
bf90: 73 74 20 29 3b 0a 20 20 64 65 73 74 20 3d 20 2a  st );.  dest = *
bfa0: 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
bfb0: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
bfc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
bfd0: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
bfe0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
bff0: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
c000: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
c010: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
c020: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
c030: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
c040: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c050: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
c060: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
c070: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c080: 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
c090: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
c0a0: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
c0b0: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
c0c0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
c0d0: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
c0e0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
c0f0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
c100: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
c110: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c120: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
c130: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
c140: 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
c150: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
c160: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
c170: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
c180: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
c190: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
c1a0: 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
c1b0: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
c1c0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
c1d0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
c1e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c1f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
c200: 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
c210: 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  Parm, p->pEList-
c220: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73  >nExpr);.    des
c230: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
c240: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ble;.  }..  /* M
c250: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
c260: 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
c270: 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
c280: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
c290: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
c2a0: 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
c2b0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
c2c0: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
c2d0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
c2e0: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
c2f0: 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
c300: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
c310: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c320: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
c330: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
c340: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
c350: 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
c360: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
c370: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
c380: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
c390: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
c3a0: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
c3b0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c3c0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
c3d0: 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
c3e0: 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
c3f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
c400: 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
c410: 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
c420: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
c430: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
c440: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
c450: 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
c460: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
c470: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
c480: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
c490: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
c4a0: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
c4b0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
c4c0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
c4d0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
c4e0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
c4f0: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
c500: 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  t );.      pPrio
c510: 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
c520: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
c530: 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
c540: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
c550: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
c560: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
c570: 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  or, &dest);.    
c580: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
c590: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
c5a0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
c5b0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
c5c0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c5d0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
c5e0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
c5f0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  0;.      p->iLim
c600: 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
c610: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  mit;.      p->iO
c620: 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e  ffset = pPrior->
c630: 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  iOffset;.      i
c640: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
c650: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
c660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c670: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
c680: 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->iLimit);.     
c690: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c6a0: 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
c6b0: 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
c6c0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
c6d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
c6e0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
c6f0: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  &dest);.      te
c700: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
c710: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
c720: 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
c730: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
c740: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
c750: 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a      if( addr ){.
c760: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c770: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
c780: 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
c790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c7a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
c7b0: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
c7c0: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
c7d0: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
c7e0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
c7f0: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
c800: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
c810: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
c820: 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
c830: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
c840: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
c850: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
c860: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
c870: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
c880: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
c890: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
c8a0: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
c8b0: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
c8c0: 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
c8d0: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
c8e0: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
c8f0: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
c900: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
c910: 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
c920: 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65  ndest;..      te
c930: 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
c940: 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20  K_EXCEPT );.    
c950: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
c960: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
c970: 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53       priorOp = S
c980: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
c990: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
c9a0: 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57 41 59  priorOp && ALWAY
c9b0: 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21  S(!p->pLimit &&!
c9c0: 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20  p->pOffset) ){. 
c9d0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
c9e0: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
c9f0: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
ca00: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
ca10: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
ca20: 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
ca30: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
ca40: 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
ca50: 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f  !=p );  /* Can o
ca60: 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72 20 6c  nly happen for l
ca70: 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
ca80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caa0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d        ** of a 3-
cab0: 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70  way or more comp
cac0: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
cad0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
cae0: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
caf0: 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
cb00: 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
cb10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
cb20: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
cb30: 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
cb40: 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
cb50: 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
cb60: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
cb70: 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20   = dest.iParm;. 
cb80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cb90: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
cba0: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
cbb0: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
cbc0: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
cbd0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
cbe0: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
cbf0: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
cc00: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
cc10: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
cc20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cc30: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
cc40: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
cc50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cc60: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
cc70: 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
cc80: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  b, 0);.        a
cc90: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
cca0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
ccb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
ccc0: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
ccd0: 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  addr;.        p-
cce0: 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c  >pRightmost->sel
ccf0: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
cd00: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
cd10: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
cd20: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
cd30: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
cd40: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
cd50: 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
cd60: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cd70: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
cd80: 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
cd90: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
cda0: 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
cdb0: 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
cdc0: 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 72  ionTab);.      r
cdd0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
cde0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
cdf0: 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
ce00: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
ce10: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
ce20: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
ce30: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
ce40: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
ce50: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ce60: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
ce70: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45   if( p->op==TK_E
ce80: 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20  XCEPT ){.       
ce90: 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
cea0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ceb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cec0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
ced0: 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53  ;.        op = S
cee0: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
cef0: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
cf00: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
cf10: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
cf20: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
cf30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
cf40: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
cf50: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
cf60: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e  et = 0;.      un
cf70: 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20  iondest.eDest = 
cf80: 6f 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  op;.      rc = s
cf90: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
cfa0: 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
cfb0: 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
cfc0: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
cfd0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51  OK );.      /* Q
cfe0: 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
cff0: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
d000: 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20  () might refill 
d010: 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20  p->pOrderBy..   
d020: 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
d030: 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
d040: 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
d050: 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
d060: 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
d070: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d080: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
d090: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70  rderBy);.      p
d0a0: 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
d0b0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
d0c0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
d0d0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
d0e0: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
d0f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
d100: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
d110: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
d120: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
d130: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
d140: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  t;.      p->iLim
d150: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
d160: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >iOffset = 0;.. 
d170: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
d180: 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
d190: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
d1a0: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
d1b0: 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
d1c0: 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
d1d0: 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
d1e0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
d1f0: 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e   unionTab==dest.
d200: 69 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44  iParm || dest.eD
d210: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a  est!=priorOp );.
d220: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
d230: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
d240: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
d250: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
d260: 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
d270: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d280: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73  .        if( des
d290: 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
d2a0: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  put ){.         
d2b0: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
d2c0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = p;.          w
d2d0: 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
d2e0: 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
d2f0: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
d300: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
d310: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
d320: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
d330: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
d340: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
d350: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
d360: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
d370: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
d380: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d390: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63  el(v);.        c
d3a0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
d3b0: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
d3c0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
d3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d3e0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
d3f0: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
d400: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  k);.        iSta
d410: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
d420: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
d430: 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
d440: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
d450: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
d460: 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73  ionTab, p->pELis
d470: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20    0, -1, &dest, 
d4a0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
d4b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d4c0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d4d0: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
d4e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d4f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
d500: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
d510: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
d520: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
d530: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
d540: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d550: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d560: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
d570: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
d580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d590: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
d5a0: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
d5b0: 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
d5c0: 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
d5d0: 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
d5e0: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
d5f0: 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
d600: 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
d610: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
d620: 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
d630: 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
d640: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
d650: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
d660: 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
d670: 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
d680: 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
d690: 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
d6a0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d6b0: 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
d6c0: 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
d6d0: 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
d6e0: 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
d6f0: 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
d700: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
d710: 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
d720: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
d730: 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
d740: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
d750: 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
d760: 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
d770: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
d780: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
d790: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
d7a0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
d7b0: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
d7c0: 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
d7d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
d7e0: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
d7f0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67  r;.      p->pRig
d800: 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73  htmost->selFlags
d810: 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
d820: 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
d830: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d840: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
d850: 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
d860: 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
d870: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
d880: 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
d890: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d8a0: 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
d8b0: 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
d8c0: 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
d8d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
d8e0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
d8f0: 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64  ior, &intersectd
d900: 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
d910: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
d920: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d930: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
d940: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
d950: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
d960: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
d970: 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
d980: 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
d990: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d9a0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
d9b0: 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29  emeral, tab2, 0)
d9c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d9d0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
d9e0: 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
d9f0: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
da00: 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[1] = addr;.   
da10: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
da20: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
da30: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
da40: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
da50: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
da60: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
da70: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
da80: 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65  0;.      interse
da90: 63 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74  ctdest.iParm = t
daa0: 61 62 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ab2;.      rc = 
dab0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
dac0: 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
dad0: 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
dae0: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
daf0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
db00: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
db10: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
db20: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
db30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
db40: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
db50: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
db60: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
db70: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
db80: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20  et = pOffset;.. 
db90: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
dba0: 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
dbb0: 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
dbc0: 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
dbd0: 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
dbe0: 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
dbf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
dc00: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
dc10: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
dc20: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
dc30: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
dc40: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
dc50: 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
dc60: 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
dc70: 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
dc80: 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  ;.        genera
dc90: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
dca0: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
dcb0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
dcc0: 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
dcd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
dce0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
dcf0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
dd00: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
dd10: 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
dd20: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
dd30: 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
dd40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dd50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
dd60: 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
dd70: 65 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  eak);.      r1 =
dd80: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
dd90: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
dda0: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
ddb0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ddc0: 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c  OP_RowKey, tab1,
ddd0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
dde0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ddf0: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
de00: 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 29 3b 0a  b2, iCont, r1);.
de10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
de20: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
de30: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
de40: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
de50: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
de60: 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45  ist, tab1, p->pE
de70: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c     0, -1, &dest,
dea0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
deb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dec0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
ded0: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
dee0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
def0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
df00: 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
df10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
df20: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
df30: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
df40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
df50: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
df60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
df70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
df80: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
df90: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
dfa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
dfb0: 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
dfc0: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
dfd0: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
dfe0: 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
dff0: 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
e000: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
e010: 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
e020: 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
e030: 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
e040: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
e050: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
e060: 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
e070: 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
e080: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e090: 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
e0a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
e0b0: 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
e0c0: 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
e0d0: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
e0e0: 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
e0f0: 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
e100: 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
e110: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
e120: 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
e130: 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
e140: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
e150: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
e160: 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
e170: 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
e180: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e1a0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
e1b0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
e1c0: 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
e1d0: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
e1e0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
e1f0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
e200: 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e220: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
e230: 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
e240: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
e250: 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
e260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
e270: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
e280: 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
e290: 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
e2a0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
e2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e2c0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
e2d0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
e2e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e2f0: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a  Rightmost==p );.
e300: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45      nCol = p->pE
e310: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
e320: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
e330: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
e340: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
e350: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
e360: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f  f(*pKeyInfo)+nCo
e370: 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  l*(sizeof(CollSe
e380: 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69  q*) + 1));.    i
e390: 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  f( !pKeyInfo ){.
e3a0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e3b0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
e3c0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e3d0: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
e3e0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d   pKeyInfo->enc =
e3f0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 4b   ENC(db);.    pK
e400: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
e410: 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a 20 20 20   (u16)nCol;..   
e420: 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
e430: 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
e440: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
e450: 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
e460: 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
e470: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
e480: 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
e490: 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
e4a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
e4b0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
e4c0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
e4d0: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
e4e0: 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
e4f0: 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
e500: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
e510: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
e520: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
e530: 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
e540: 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
e550: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
e560: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
e570: 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
e580: 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
e590: 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
e5a0: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
e5b0: 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
e5c0: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
e5d0: 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
e5e0: 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
e5f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e600: 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
e610: 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
e620: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e630: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
e640: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e650: 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
e660: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e670: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
e680: 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
e690: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
e6a0: 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
e6b0: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
e6c0: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
e6d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
e6e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b  te3DbFree(db, pK
e6f0: 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
e700: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
e710: 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
e720: 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65  dest.iMem;.  pDe
e730: 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e  st->nMem = dest.
e740: 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
e750: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
e760: 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
e770: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
e780: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
e790: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
e7a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  /../*.** Code an
e7b0: 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
e7c0: 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
e7d0: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
e7e0: 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
e7f0: 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
e800: 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
e810: 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
e820: 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d  ned in pIn->iMem
e830: 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20  .  There are.** 
e840: 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e  pIn->nMem column
e850: 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
e860: 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
e870: 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
e880: 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
e890: 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
e8a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
e8b0: 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
e8c0: 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
e8d0: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
e8e0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
e8f0: 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
e900: 20 69 73 20 61 20 74 68 65 20 66 69 72 73 74 20   is a the first 
e910: 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
e920: 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
e930: 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
e940: 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
e950: 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
e960: 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
e970: 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
e980: 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
e990: 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
e9a0: 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
e9b0: 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
e9c0: 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
e9d0: 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
e9e0: 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
e9f0: 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
ea00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
ea10: 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
ea20: 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
ea30: 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
ea40: 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
ea50: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
ea60: 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
ea70: 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
ea80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ea90: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
eaa0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
eab0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
eac0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
ead0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
eae0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
eaf0: 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
eb00: 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
eb10: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
eb20: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
eb30: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
eb40: 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
eb50: 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
eb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
eb70: 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
eb80: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
eb90: 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
eba0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
ebb0: 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
ebc0: 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
ebd0: 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
ebe0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
ebf0: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
ec00: 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
ec10: 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
ec20: 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  t p4type,       
ec30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20        /* The p4 
ec40: 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66  type for pKeyInf
ec50: 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  o */.  int iBrea
ec60: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
ec70: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
ec80: 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
ec90: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
eca0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
ecb0: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
ecc0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
ecd0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
ece0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ecf0: 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
ed00: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
ed10: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
ed20: 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
ed30: 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
ed40: 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
ed50: 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
ed60: 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
ed70: 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20  int j1, j2;.    
ed80: 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
ed90: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
eda0: 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20  ot, regPrev);.  
edb0: 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
edc0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
edd0: 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65  ompare, pIn->iMe
ede0: 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  m, regPrev+1, pI
edf0: 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20  n->nMem,.       
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
ee20: 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b  eyInfo, p4type);
ee30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ee40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
ee50: 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  p, j2+2, iContin
ee60: 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73  ue, j2+2);.    s
ee70: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ee80: 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73  re(v, j1);.    s
ee90: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
eea0: 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  py(pParse, pIn->
eeb0: 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c  iMem, regPrev+1,
eec0: 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20   pIn->nMem);.   
eed0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eee0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
eef0: 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 1, regPrev);. 
ef00: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
ef10: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
ef20: 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  d ) return 0;.. 
ef30: 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65   /* Suppress the
ef40: 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
ef50: 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65  T entries if the
ef60: 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20  re is an OFFSET 
ef70: 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f  clause.  */.  co
ef80: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
ef90: 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77  Continue);..  sw
efa0: 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
efb0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
efc0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
efd0: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
efe0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
eff0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
f000: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
f010: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
f020: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
f030: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
f040: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
f050: 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
f060: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
f070: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f080: 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
f090: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
f0a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
f0b0: 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
f0c0: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
f0d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f0e0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
f0f0: 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  ord, pIn->iMem, 
f100: 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b 0a  pIn->nMem, r1);.
f110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f120: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
f130: 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
f140: 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20  Parm, r2);.     
f150: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f160: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
f170: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72   pDest->iParm, r
f180: 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
f190: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
f1a0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
f1b0: 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
f1c0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f1d0: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
f1e0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
f1f0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
f200: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
f210: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
f220: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
f230: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
f240: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
f250: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
f260: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
f270: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
f280: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
f290: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
f2a0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
f2b0: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
f2c0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
f2d0: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
f2e0: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
f2f0: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
f300: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
f310: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
f320: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
f330: 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20  >nMem==1 );.    
f340: 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20    p->affinity = 
f350: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
f360: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
f370: 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  (p->pEList->a[0]
f380: 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
f390: 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20  ffinity);.      
f3a0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
f3b0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
f3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f3d0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
f3e0: 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
f3f0: 4d 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e  Mem, 1, r1, &p->
f400: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
f410: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
f420: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
f430: 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
f440: 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  iMem, 1);.      
f450: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f460: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
f470: 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  t, pDest->iParm,
f480: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
f490: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f4a0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
f4b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f4c0: 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76  }..#if 0  /* Nev
f4d0: 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20  er occurs on an 
f4e0: 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20 2a  ORDER BY query *
f4f0: 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  /.    /* If any 
f500: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
f510: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
f520: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
f530: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
f540: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
f550: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
f560: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f570: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
f580: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
f590: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
f5a0: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
f5b0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
f5c0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
f5d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
f5e0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
f5f0: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
f600: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
f610: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
f620: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
f630: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
f640: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
f650: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
f660: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
f670: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
f680: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
f690: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
f6a0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
f6b0: 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d  ert( pIn->nMem==
f6c0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
f6d0: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
f6e0: 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
f6f0: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
f700: 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
f710: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
f720: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
f730: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
f740: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
f750: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
f760: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f770: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
f780: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
f790: 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
f7a0: 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
f7b0: 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
f7c0: 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
f7d0: 74 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 6e 20 74  t->iMem.  Then t
f7e0: 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
f7f0: 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
f800: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
f810: 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
f820: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20   pDest->iMem==0 
f830: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  ){.        pDest
f840: 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33  ->iMem = sqlite3
f850: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
f860: 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b  rse, pIn->nMem);
f870: 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
f880: 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d 65 6d  nMem = pIn->nMem
f890: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f8a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
f8b0: 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
f8c0: 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 4d  >iMem, pDest->iM
f8d0: 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 29  em, pDest->nMem)
f8e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f8f0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f900: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50  Yield, pDest->iP
f910: 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  arm);.      brea
f920: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
f930: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
f940: 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
f950: 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69  result destinati
f960: 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a  on must be.    *
f970: 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54  * SRT_Output.  T
f980: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
f990: 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
f9a0: 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a   any other.    *
f9b0: 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74  * destination ot
f9c0: 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
f9d0: 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20  s handled above 
f9e0: 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20  or SRT_Output.. 
f9f0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
fa00: 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73   SRT_Output, res
fa10: 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
fa20: 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
fa30: 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20   registers.  .  
fa40: 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50    ** Then the OP
fa50: 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64  _ResultRow opcod
fa60: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75  e is used to cau
fa70: 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  se sqlite3_step(
fa80: 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) to.    ** retu
fa90: 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  rn the next row 
faa0: 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a  of result..    *
fab0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
fac0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fad0: 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
fae0: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
faf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fb00: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
fb10: 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70  ow, pIn->iMem, p
fb20: 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  In->nMem);.     
fb30: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
fb40: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
fb50: 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
fb60: 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20  m, pIn->nMem);. 
fb70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fb80: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  }.  }..  /* Jump
fb90: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
fba0: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
fbb0: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
fbc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
fbd0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
fbe0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fbf0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
fc00: 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20  iLimit, -1);.   
fc10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc20: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
fc30: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
fc40: 61 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ak);.  }..  /* G
fc50: 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72  enerate the subr
fc60: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20  outine return.  
fc70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
fc80: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
fc90: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71  iContinue);.  sq
fca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fcb0: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
fcc0: 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74  gReturn);..  ret
fcd0: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
fce0: 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63  ** Alternative c
fcf0: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63  ompound select c
fd00: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f  ode generator fo
fd10: 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65  r cases when the
fd20: 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45  re.** is an ORDE
fd30: 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  R BY clause..**.
fd40: 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71  ** We assume a q
fd50: 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c  uery of the foll
fd60: 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  owing form:.**.*
fd70: 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e  *      <selectA>
fd80: 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73    <operator>  <s
fd90: 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42  electB>  ORDER B
fda0: 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a  Y <orderbylist>.
fdb0: 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  **.** <operator>
fdc0: 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e   is one of UNION
fdd0: 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43   ALL, UNION, EXC
fde0: 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
fdf0: 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20  T.  The idea.** 
fe00: 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20  is to code both 
fe10: 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73  <selectA> and <s
fe20: 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65  electB> with the
fe30: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
fe40: 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e   as.** co-routin
fe50: 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68  es.  Then run th
fe60: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e  e co-routines in
fe70: 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65   parallel and me
fe80: 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rge the results.
fe90: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ** into the outp
fea0: 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  ut.  In addition
feb0: 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f   to the two coro
fec0: 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73  utines (called s
fed0: 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65  electA and.** se
fee0: 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65  lectB) there are
fef0: 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a   7 subroutines:.
ff00: 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20  **.**    outA:  
ff10: 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
ff20: 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41  t of the selectA
ff30: 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
ff40: 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
ff50: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
ff60: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
ff70: 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  .**.**    outB: 
ff80: 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
ff90: 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
ffa0: 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  B coroutine into
ffb0: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
ffc0: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
ffd0: 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
ffe0: 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74  .  (Only generat
fff0: 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64  ed for UNION and
10000 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10010 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45  UNION ALL.  EXCE
10020 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43  PT and INSERTSEC
10030 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61  T never output a
10040 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20   row that.**    
10050 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73           appears
10060 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a   only in B.).**.
10070 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43  **    AltB:    C
10080 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
10090 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
100a0 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
100b0 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A<B..**.**    
100c0 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AeqB:    Called 
100d0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
100e0 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
100f0 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42  outines and A==B
10100 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a  ..**.**    AgtB:
10110 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
10120 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
10130 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
10140 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a  es and A>B..**.*
10150 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61  *    EofA:    Ca
10160 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
10170 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
10180 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20   selectA..**.** 
10190 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c     EofB:    Call
101a0 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
101b0 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
101c0 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68  electB..**.** Th
101d0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
101e0 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66   of the latter f
101f0 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ive subroutines 
10200 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20  depend on which 
10210 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
10220 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a  s used:.**.**.**
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
10240 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55  ON ALL         U
10250 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20  NION            
10260 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20  EXCEPT          
10270 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20  INTERSECT.**    
10280 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
10290 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
102a0 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
102b0 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
102c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41  ---------.**   A
102d0 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ltB:   outA, nex
102e0 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
102f0 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
10300 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
10310 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42  xtA.**.**   AeqB
10320 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
10330 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
10340 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20            nextA 
10350 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65          outA, ne
10360 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42  xtA.**.**   AgtB
10370 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
10380 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
10390 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20            nextB 
103a0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42             nextB
103b0 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20  .**.**   EofA:  
103c0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
103d0 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
103e0 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20         halt     
103f0 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
10400 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74  **   EofB:   out
10410 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
10420 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
10430 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
10440 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49      halt.**.** I
10450 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42  n the AltB, AeqB
10460 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f  , and AgtB subro
10470 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f  utines, an EOF o
10480 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n A following ne
10490 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e  xtA.** causes an
104a0 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
104b0 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45  to EofA and an E
104c0 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e  OF on B followin
104d0 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a  g nextB causes.*
104e0 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  * an immediate j
104f0 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69  ump to EofB.  Wi
10500 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f  thin EofA and Eo
10510 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65  fB, and EOF on e
10520 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f  ntry or.** follo
10530 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65  wing nextX cause
10540 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  s a jump to the 
10550 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63  end of the selec
10560 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  t processing..**
10570 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65  .** Duplicate re
10580 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49  moval in the UNI
10590 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
105a0 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20  INTERSECT cases 
105b0 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69  is handled.** wi
105c0 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  thin the output 
105d0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
105e0 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65   regPrev registe
105f0 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20  r set holds the 
10600 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75  previously.** ou
10610 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63  tput value.  A c
10620 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
10630 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76  e against this v
10640 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74  alue and the out
10650 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65  put.** is skippe
10660 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65  d if the next re
10670 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74  sults would be t
10680 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
10690 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54  revious..**.** T
106a0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
106b0 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70  n plan is to imp
106c0 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63  lement the two c
106d0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65  oroutines and se
106e0 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e  ven.** subroutin
106f0 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70  es first, then p
10700 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c  ut the control l
10710 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74  ogic at the bott
10720 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a  om.  Like this:.
10730 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67  **.**          g
10740 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20  oto Init.**     
10750 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coA: coroutine f
10760 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41  or left query (A
10770 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f  ).**     coB: co
10780 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
10790 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20  t query (B).**  
107a0 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f    outA: output o
107b0 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20  ne row of A.**  
107c0 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f    outB: output o
107d0 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49  ne row of B (UNI
107e0 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c  ON and UNION ALL
107f0 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66   only).**    Eof
10800 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66  A: ....**    Eof
10810 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74  B: ....**    Alt
10820 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71  B: ....**    Aeq
10830 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74  B: ....**    Agt
10840 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69  B: ....**    Ini
10850 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  t: initialize co
10860 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
10870 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  s.**          yi
10880 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20  eld coA.**      
10890 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f      if eof(A) go
108a0 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20  to EofA.**      
108b0 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a      yield coB.**
108c0 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
108d0 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a  (B) goto EofB.**
108e0 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72      Cmpr: Compar
108f0 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20  e A, B.**       
10900 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65     Jump AltB, Ae
10910 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20  qB, AgtB.**     
10920 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57  End: ....**.** W
10930 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71  e call AltB, Aeq
10940 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61  B, AgtB, EofA, a
10950 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74  nd EofB "subrout
10960 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61  ines" but they a
10970 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c  re not.** actual
10980 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20  ly called using 
10990 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64  Gosub and they d
109a0 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45  o not Return.  E
109b0 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f  ofA and EofB loo
109c0 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64  p.** until all d
109d0 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
109e0 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68   then jump to th
109f0 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41  e "end" labe.  A
10a00 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e  ltB, AeqB,.** an
10a10 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65  d AgtB jump to e
10a20 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f  ither L2 or to o
10a30 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f  ne of EofA or Eo
10a40 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  fB..*/.#ifndef S
10a50 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
10a60 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69  UND_SELECT.stati
10a70 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
10a80 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
10a90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10aa0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
10ab0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
10ac0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10ad0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
10ae0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
10af0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
10b00 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
10b10 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
10b20 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
10b30 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
10b40 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
10b50 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10b60 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ers */.  Select 
10b70 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
10b80 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
10b90 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
10ba0 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
10bb0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
10bc0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10bd0 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
10be0 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
10bf0 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20  t destA;     /* 
10c00 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
10c10 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20  coroutine A */. 
10c20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
10c30 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  B;     /* Destin
10c40 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
10c50 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72  ine B */.  int r
10c60 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20  egAddrA;        
10c70 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
10c80 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
10c90 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
10ca0 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20   int regEofA;   
10cb0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74         /* Flag t
10cc0 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20  o indicate when 
10cd0 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70  select-A is comp
10ce0 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  lete */.  int re
10cf0 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
10d00 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
10d10 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
10d20 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
10d30 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20  int regEofB;    
10d40 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f        /* Flag to
10d50 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73   indicate when s
10d60 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c  elect-B is compl
10d70 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ete */.  int add
10d80 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
10d90 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10da0 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
10db0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
10dc0 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
10dd0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10de0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
10df0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
10e00 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
10e10 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
10e20 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
10e30 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
10e40 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
10e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
10e60 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
10e70 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
10e80 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
10e90 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
10ea0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10eb0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
10ec0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10ed0 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
10ee0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
10ef0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
10f00 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
10f10 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
10f20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10f30 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
10f40 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
10f50 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10f60 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
10f70 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10f80 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
10f90 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
10fa0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
10fb0 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
10fc0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
10fd0 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
10fe0 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
10ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
11000 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
11010 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
11020 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
11030 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
11040 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
11050 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
11060 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
11070 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
11080 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
11090 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
110a0 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
110b0 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
110c0 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
110d0 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
110e0 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
110f0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
11100 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
11110 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
11120 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
11130 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
11140 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
11150 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
11160 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
11170 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
11180 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
11190 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
111a0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
111b0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
111c0 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
111d0 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
111e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
111f0 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
11200 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
11210 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
11220 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
11230 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
11240 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
11250 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
11260 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
11270 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
11280 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
11290 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
112a0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
112b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
112c0 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61  up = 0; /* Compa
112d0 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
112e0 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
112f0 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
11300 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
11310 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
11320 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
11330 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
11340 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
11350 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
11360 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11370 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11380 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
11390 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
113a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
113b0 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
113c0 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
113d0 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
113e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
113f0 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
11400 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
11410 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
11420 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
11430 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73  olumns */..  ass
11440 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
11450 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
11460 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
11470 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
11480 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
11490 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
114a0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
114b0 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
114c0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
114d0 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
114e0 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e  * Already thrown
114f0 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44   the error if VD
11500 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  BE alloc failed 
11510 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  */.  labelEnd = 
11520 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11530 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
11540 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
11550 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
11560 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
11570 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
11580 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
11590 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
115a0 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
115b0 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
115c0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
115d0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
115e0 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
115f0 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
11600 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
11610 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
11620 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
11630 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
11640 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
11650 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
11660 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
11670 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
11680 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
11690 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
116a0 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
116b0 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
116c0 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
116d0 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
116e0 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
116f0 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
11700 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
11710 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
11720 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11730 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
11740 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
11750 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
11760 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
11770 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
11780 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
11790 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
117a0 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  m->iCol>0 );.   
117b0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
117c0 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b  iCol==i ) break;
117d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
117e0 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29  f( j==nOrderBy )
117f0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
11800 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
11810 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  pr(db, TK_INTEGE
11820 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  R, 0);.        i
11830 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
11840 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11850 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
11860 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
11870 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
11880 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
11890 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
118a0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
118b0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
118c0 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
118d0 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  w);.        pOrd
118e0 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
118f0 2b 2b 5d 2e 69 43 6f 6c 20 3d 20 28 75 31 36 29  ++].iCol = (u16)
11900 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
11910 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
11920 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
11930 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e  n permutation an
11940 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69  d keyinfo that i
11950 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a  s used with.  **
11960 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
11970 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
11980 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
11990 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
119a0 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
119b0 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
119c0 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
119d0 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
119e0 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
119f0 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
11a00 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
11a10 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
11a20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
11a30 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
11a40 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
11a50 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
11a60 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
11a70 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
11a80 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11a90 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
11aa0 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b  (int)*nOrderBy);
11ab0 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
11ac0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
11ad0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
11ae0 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  em;.    for(i=0,
11af0 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
11b00 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; i<nOrderBy; 
11b10 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
11b20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
11b30 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26 26 20 70  em->iCol>0  && p
11b40 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e 70  Item->iCol<=p->p
11b50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
11b60 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69        aPermute[i
11b70 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20  ] = pItem->iCol 
11b80 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  - 1;.    }.    p
11b90 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20 20 20  KeyMerge =.     
11ba0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11bb0 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
11bc0 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64 65  pKeyMerge)+nOrde
11bd0 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  rBy*(sizeof(Coll
11be0 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20 69  Seq*)+1));.    i
11bf0 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b 0a  f( pKeyMerge ){.
11c00 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
11c10 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
11c20 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e 61  8*)&pKeyMerge->a
11c30 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  Coll[nOrderBy];.
11c40 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
11c50 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e  >nField = (u16)n
11c60 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
11c70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d 20  KeyMerge->enc = 
11c80 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66  ENC(db);.      f
11c90 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
11ca0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
11cb0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
11cc0 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  ;.        Expr *
11cd0 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  pTerm = pOrderBy
11ce0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
11cf0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
11d00 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
11d10 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
11d20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65 72      pColl = pTer
11d30 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  m->pColl;.      
11d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11d50 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
11d60 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
11d70 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74  arse, p, aPermut
11d80 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  e[i]);.         
11d90 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
11da0 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
11db0 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
11dc0 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
11dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11de0 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f    pKeyMerge->aCo
11df0 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
11e00 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65         pKeyMerge
11e10 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
11e20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
11e30 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
11e40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
11e50 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65  e{.    pKeyMerge
11e60 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
11e70 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44  Reattach the ORD
11e80 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
11e90 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
11ea0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
11eb0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69  pOrderBy;.  pPri
11ec0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  or->pOrderBy = s
11ed0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
11ee0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  p(pParse->db, pO
11ef0 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f  rderBy, 0);..  /
11f00 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
11f10 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
11f20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
11f30 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
11f40 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
11f50 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
11f60 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
11f70 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
11f80 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
11f90 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
11fa0 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
11fb0 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
11fc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
11fd0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
11fe0 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
11ff0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
12000 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
12010 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
12020 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
12030 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
12040 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
12050 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33 47  gPrev = sqlite3G
12060 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
12070 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20 20  se, nExpr+1);.  
12080 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12090 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
120a0 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 0, regPrev);.
120b0 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71      pKeyDup = sq
120c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
120d0 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  o(db,.          
120e0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
120f0 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78 70 72  pKeyDup) + nExpr
12100 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
12110 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28  *)+1) );.    if(
12120 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
12130 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
12140 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b  Order = (u8*)&pK
12150 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78  eyDup->aColl[nEx
12160 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 44  pr];.      pKeyD
12170 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  up->nField = (u1
12180 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 70  6)nExpr;.      p
12190 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e  KeyDup->enc = EN
121a0 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  C(db);.      for
121b0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
121c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
121d0 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
121e0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
121f0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
12200 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
12210 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
12220 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
12230 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
12240 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
12250 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
12260 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
12270 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
12280 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
12290 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
122a0 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
122b0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
122c0 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
122d0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
122e0 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ER");.  if( pPri
122f0 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
12300 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
12310 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
12320 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
12330 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
12340 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a  , "ORDER");.  }.
12350 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
12360 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
12370 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
12380 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
12390 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64  rse, p, labelEnd
123a0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
123b0 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  it && op==TK_ALL
123c0 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74   ){.    regLimit
123d0 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
123e0 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  em;.    regLimit
123f0 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
12400 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
12410 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12420 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Copy, p->iOffset
12430 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20   ? p->iOffset+1 
12440 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20  : p->iLimit,.   
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
12470 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73  egLimitA);.    s
12480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12490 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
124a0 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74  LimitA, regLimit
124b0 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  B);.  }else{.   
124c0 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67   regLimitA = reg
124d0 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a  LimitB = 0;.  }.
124e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
124f0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
12500 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  t);.  p->pLimit 
12510 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
12520 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
12530 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70  pOffset);.  p->p
12540 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72  Offset = 0;..  r
12550 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
12560 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45  se->nMem;.  regE
12570 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ofA = ++pParse->
12580 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42  nMem;.  regAddrB
12590 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
125a0 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20 2b  m;.  regEofB = +
125b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
125c0 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61   regOutA = ++pPa
125d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
125e0 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutB = ++pParse-
125f0 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
12600 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
12610 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75  destA, SRT_Corou
12620 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
12630 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
12640 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c  DestInit(&destB,
12650 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
12660 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
12670 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20 76   Jump past the v
12680 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69 6e  arious subroutin
12690 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65  es and coroutine
126a0 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20  s to the main.  
126b0 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  ** merge loop.  
126c0 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  */.  j1 = sqlite
126d0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
126e0 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53  P_Goto);.  addrS
126f0 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
12700 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
12710 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  v);...  /* Gener
12720 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
12730 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
12740 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12750 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
12760 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
12770 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
12780 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
12790 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
127a0 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63  ent((v, "Begin c
127b0 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
127c0 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
127d0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
127e0 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73 71 6c  regLimitA;.  sql
127f0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
12800 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
12810 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
12820 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12830 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66  teger, 1, regEof
12840 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
12850 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
12860 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
12870 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12880 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75  t((v, "End corou
12890 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45  tine for left SE
128a0 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47  LECT"));..  /* G
128b0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
128c0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
128d0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
128e0 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
128f0 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
12900 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
12910 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
12920 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
12930 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e  Addr(v);.  VdbeN
12940 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12950 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20  Begin coroutine 
12960 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54  for right SELECT
12970 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69  "));.  savedLimi
12980 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
12990 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70   savedOffset = p
129a0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
129b0 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
129c0 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  tB;.  p->iOffset
129d0 20 3d 20 30 3b 20 20 0a 20 20 73 71 6c 69 74 65   = 0;  .  sqlite
129e0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
129f0 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
12a00 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
12a10 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
12a20 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
12a30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12a40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
12a50 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29  ger, 1, regEofB)
12a60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12a70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
12a80 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
12a90 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12aa0 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69  (v, "End corouti
12ab0 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c  ne for right SEL
12ac0 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  ECT"));..  /* Ge
12ad0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
12ae0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
12af0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
12b00 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
12b10 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
12b20 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
12b30 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
12b40 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
12b50 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12b60 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
12b70 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
12b80 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
12b90 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
12ba0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
12bb0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
12bc0 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
12bd0 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
12be0 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
12bf0 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46  eyDup, P4_KEYINF
12c00 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65 6c  O_HANDOFF, label
12c10 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65  End);.  .  /* Ge
12c20 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
12c30 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
12c40 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
12c50 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73   of the B.  ** s
12c60 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
12c70 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
12c80 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
12c90 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
12ca0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
12cb0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
12cc0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12cd0 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
12ce0 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a  utine for B"));.
12cf0 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67      addrOutB = g
12d00 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
12d10 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d30 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73   p, &destB, pDes
12d40 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20  t, regOutB,.    
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
12d60 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50  Prev, pKeyDup, P
12d70 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43  4_KEYINFO_STATIC
12d80 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
12d90 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
12da0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
12db0 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
12dc0 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
12dd0 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   A.  ** are exha
12de0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
12df0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20  ata in select B 
12e00 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
12e10 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12e20 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f  (v, "eof-A subro
12e30 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28 20  utine"));.  if( 
12e40 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
12e50 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
12e60 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
12e70 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
12e80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
12e90 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  , 0, labelEnd);.
12ea0 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 61    }else{  .    a
12eb0 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
12ec0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12ed0 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c  P_If, regEofB, l
12ee0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71  abelEnd);.    sq
12ef0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12f00 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
12f10 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
12f20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12f30 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
12f40 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
12f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12f60 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
12f70 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20   0, addrEofA);. 
12f80 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
12f90 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
12fa0 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
12fb0 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
12fc0 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
12fd0 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
12fe0 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
12ff0 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
13000 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
13010 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
13020 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
13030 41 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  A;.  }else{  .  
13040 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
13050 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62  t((v, "eof-B sub
13060 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
13070 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74  addrEofB = sqlit
13080 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13090 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
130a0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73  labelEnd);.    s
130b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
130c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
130d0 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
130e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
130f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
13100 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
13110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13120 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
13130 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  , 0, addrEofB);.
13140 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
13150 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
13160 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
13170 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
13180 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
13190 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
131a0 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
131b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
131c0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
131d0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
131e0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
131f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
13200 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
13210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13220 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
13230 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29  gEofA, addrEofA)
13240 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13250 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
13260 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
13270 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
13280 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
13290 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a  he case of A==B.
132a0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
132b0 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64  K_ALL ){.    add
132c0 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
132d0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
132e0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
132f0 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
13300 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61   addrAltB;.    a
13310 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c  ddrAltB++;.  }el
13320 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  se{.    VdbeNoop
13330 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65  Comment((v, "A-e
13340 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  q-B subroutine")
13350 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  );.    addrAeqB 
13360 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  =.    sqlite3Vdb
13370 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
13380 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
13390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
133a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
133b0 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
133c0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
133d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
133e0 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
133f0 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  pr);.  }..  /* G
13400 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13410 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
13420 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64  of A>B.  */.  Vd
13430 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
13440 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75  , "A-gt-B subrou
13450 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
13460 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  gtB = sqlite3Vdb
13470 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
13480 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
13490 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
134a0 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
134b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
134c0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
134d0 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a   addrOutB);.  }.
134e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
134f0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
13500 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71   regAddrB);.  sq
13510 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13520 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
13530 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  B, addrEofB);.  
13540 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13550 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
13560 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
13570 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e  /* This code run
13580 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61  s once to initia
13590 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e  lize everything.
135a0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
135b0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
135c0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
135d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
135e0 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66  teger, 0, regEof
135f0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
13600 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
13610 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66  teger, 0, regEof
13620 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
13630 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13640 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61  sub, regAddrA, a
13650 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73  ddrSelectA);.  s
13660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13670 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
13680 67 41 64 64 72 42 2c 20 61 64 64 72 53 65 6c 65  gAddrB, addrSele
13690 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ctB);.  sqlite3V
136a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
136b0 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
136c0 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  rEofA);.  sqlite
136d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
136e0 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61  P_If, regEofB, a
136f0 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20  ddrEofB);..  /* 
13700 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61  Implement the ma
13710 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  in merge loop.  
13720 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
13730 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
13740 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71  labelCmpr);.  sq
13750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13760 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  v, OP_Permutatio
13770 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  n, 0, 0, 0, (cha
13780 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f  r*)aPermute, P4_
13790 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c  INTARRAY);.  sql
137a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
137b0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
137c0 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e  stA.iMem, destB.
137d0 69 4d 65 6d 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  iMem, nOrderBy,.
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
13800 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
13810 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
13820 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13830 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
13840 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
13850 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a  qB, addrAgtB);..
13860 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 65 6d    /* Release tem
13870 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
13880 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50  .  */.  if( regP
13890 72 65 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rev ){.    sqlit
138a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
138b0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 50 72  ge(pParse, regPr
138c0 65 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31 29 3b  ev, nOrderBy+1);
138d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
138e0 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e  to the this poin
138f0 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65  t in order to te
13900 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72  rminate the quer
13910 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
13920 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
13930 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  l(v, labelEnd);.
13940 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
13950 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63  mber of output c
13960 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
13970 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
13980 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
13990 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
139a0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77   = pPrior;.    w
139b0 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
139c0 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
139d0 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
139e0 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
139f0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
13a00 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
13a10 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  t);.  }..  /* Re
13a20 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d  assembly the com
13a30 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74  pound query so t
13a40 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66  hat it will be f
13a50 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  reed correctly. 
13a60 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69   ** by the calli
13a70 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ng function */. 
13a80 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
13a90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
13aa0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
13ab0 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  >pPrior);.  }.  
13ac0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
13ad0 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a  or;..  /*** TBD:
13ae0 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74    Insert subrout
13af0 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f  ine calls to clo
13b00 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e  se cursors on in
13b10 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20  complete.  **** 
13b20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f  subqueries ****/
13b30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13b40 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
13b50 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
13b60 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13b70 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
13b80 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
13b90 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61  /* Forward Decla
13ba0 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
13bb0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
13bc0 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45  List(sqlite3*, E
13bd0 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45  xprList*, int, E
13be0 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
13bf0 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
13c00 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c  ct(sqlite3*, Sel
13c10 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72  ect *, int, Expr
13c20 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  List *);../*.** 
13c30 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
13c40 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
13c50 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
13c60 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
13c70 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
13c80 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
13c90 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
13ca0 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
13cb0 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
13cc0 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
13cd0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
13ce0 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
13cf0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
13d00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13d10 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
13d20 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
13d30 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
13d40 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
13d50 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
13d60 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
13d70 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
13d80 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
13d90 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
13da0 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
13db0 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
13dc0 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
13dd0 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
13de0 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
13df0 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
13e00 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
13e10 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
13e20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
13e30 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
13e40 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
13e50 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
13e60 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
13e70 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
13e80 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
13e90 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
13ea0 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
13eb0 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
13ec0 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
13ed0 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
13ee0 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
13ef0 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
13f00 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
13f10 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
13f20 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
13f30 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
13f40 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
13f50 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
13f60 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
13f70 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
13f80 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
13f90 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
13fa0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
13fb0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
13fc0 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
13fd0 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
13fe0 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
13ff0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
14000 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
14010 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
14020 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
14030 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
14040 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
14050 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
14060 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
14070 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14080 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
14090 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
140a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
140b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
140c0 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
140d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
140e0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
140f0 20 69 66 28 20 70 4e 65 77 20 26 26 20 70 45 78   if( pNew && pEx
14100 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  pr->pColl ){.   
14110 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
14120 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b   = pExpr->pColl;
14130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
14140 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
14150 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
14160 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
14170 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
14180 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
14190 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
141a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
141b0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
141c0 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
141d0 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
141e0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
141f0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
14200 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
14210 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14220 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
14230 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
14240 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ect(db, pExpr->x
14250 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  .pSelect, iTable
14260 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
14270 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
14280 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
14290 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
142a0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
142b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
142c0 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
142d0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
142e0 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
142f0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
14300 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
14310 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
14320 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
14330 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
14340 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
14350 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
14360 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
14370 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
14380 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
14390 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
143a0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
143b0 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
143c0 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
143d0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
143e0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
143f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
14400 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
14410 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
14420 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
14430 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
14440 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
14450 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
14460 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
14470 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
14480 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
14490 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
144a0 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
144b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
144c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
144d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
144e0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
144f0 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
14500 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
14510 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
14520 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
14530 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
14540 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
14550 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
14560 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
14570 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
14580 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
14590 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
145a0 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
145b0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
145c0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
145d0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
145e0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
145f0 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
14600 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14610 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
14620 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
14630 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
14640 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d  ;.  p->pHaving =
14650 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
14660 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
14670 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
14680 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
14690 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
146a0 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
146b0 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63  t);.  substSelec
146c0 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  t(db, p->pPrior,
146d0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
146e0 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
146f0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
14700 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66  rc );  /* Even f
14710 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65  or (SELECT 1) we
14720 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62   have: pSrc!=0 b
14730 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  ut pSrc->nSrc==0
14740 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
14750 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f  (pSrc) ){.    fo
14760 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
14770 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
14780 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
14790 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
147a0 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lect(db, pItem->
147b0 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
147c0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
147d0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
147e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
147f0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
14800 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
14810 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
14820 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
14830 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
14840 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
14850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
14860 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
14870 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
14880 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
14890 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ies in order to 
148a0 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69  speed.** executi
148b0 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  on.  It returns 
148c0 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
148d0 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
148e0 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20  o flattening.** 
148f0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
14900 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
14910 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
14920 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
14930 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
14940 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
14950 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
14960 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
14970 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
14980 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
14990 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
149a0 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
149b0 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
149c0 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
149d0 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
149e0 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
149f0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
14a00 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
14a10 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
14a20 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
14a30 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
14a40 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
14a50 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
14a60 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
14a70 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
14a80 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
14a90 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
14aa0 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
14ab0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
14ac0 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
14ad0 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
14ae0 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
14af0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
14b00 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
14b10 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
14b20 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
14b30 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
14b40 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
14b50 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
14b60 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
14b70 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
14b80 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
14b90 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
14ba0 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
14bb0 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  pification gives
14bc0 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
14bd0 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
14be0 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
14bf0 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
14c00 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
14c10 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
14c20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
14c30 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
14c40 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
14c50 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
14c60 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
14c70 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
14c80 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
14c90 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
14ca0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
14cb0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
14cc0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
14cd0 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
14ce0 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
14cf0 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
14d00 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
14d10 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
14d20 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
14d30 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
14d40 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
14d50 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
14d60 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
14d70 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
14d80 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
14d90 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
14da0 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
14db0 68 74 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  htened by ticket
14dc0 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
14dd0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
14de0 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
14df0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
14e00 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
14e10 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  in..**.**   (5) 
14e20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
14e30 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
14e40 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14e50 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
14e60 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
14e70 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
14e80 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
14e90 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
14ea0 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
14eb0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
14ec0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
14ed0 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
14ee0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
14ef0 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
14f00 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68  .**.**   (8)  Th
14f10 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
14f20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
14f30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14f40 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
14f50 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65  **.**   (9)  The
14f60 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
14f70 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
14f80 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14f90 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
14fa0 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
14fb0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20  s..**.**  (10)  
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 61 67 67 72 65 67  s not use aggreg
14fe0 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
14ff0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
15000 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c  .**        use L
15010 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31  IMIT..**.**  (11
15020 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
15030 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
15040 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
15050 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
15060 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  auses..**.**  (1
15070 32 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  2)  Not implemen
15080 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
15090 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
150a0 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
150b0 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
150c0 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
150d0 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
150e0 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
150f0 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
15100 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
15110 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
15120 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54  t both use LIMIT
15130 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
15140 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
15150 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a  not use OFFSET.*
15160 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20  *.**  (15)  The 
15170 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
15180 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ot part of a com
15190 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20  pound select or 
151a0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
151b0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
151c0 68 61 76 65 20 62 6f 74 68 20 61 6e 20 4f 52 44  have both an ORD
151d0 45 52 20 42 59 20 61 6e 64 20 61 20 4c 49 4d 49  ER BY and a LIMI
151e0 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
151f0 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
15200 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 20 28 31  #2339).**.**  (1
15210 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  6)  The outer qu
15220 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
15230 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73  gregate or the s
15240 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20  ubquery does.** 
15250 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61         not conta
15260 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  in ORDER BY.  (T
15270 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
15280 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
15290 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
152a0 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
152b0 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
152c0 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
152d0 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
152e0 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  The sub-query is
152f0 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   not a compound 
15300 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73  select, or it is
15310 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a   a UNION ALL .**
15320 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
15330 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20   clause made up 
15340 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d  entirely of non-
15350 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
15360 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20  s, and .**      
15370 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65    the parent que
15380 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
15390 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65     * is not itse
153a0 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  lf part of a com
153b0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a  pound select,.**
153c0 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
153d0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
153e0 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72  or DISTINCT quer
153f0 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  y, and.**       
15400 20 20 20 2a 20 68 61 73 20 6e 6f 20 6f 74 68 65     * has no othe
15410 72 20 74 61 62 6c 65 73 20 6f 72 20 73 75 62 2d  r tables or sub-
15420 73 65 6c 65 63 74 73 20 69 6e 20 74 68 65 20 46  selects in the F
15430 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
15440 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
15450 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
15460 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
15470 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
15480 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
15490 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
154a0 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
154b0 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
154c0 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
154d0 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
154e0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
154f0 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66  .**.**  (18)  If
15500 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
15510 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
15520 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65  ect, then all te
15530 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  rms of the.**   
15540 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c       ORDER by cl
15550 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65  ause of the pare
15560 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c  nt must be simpl
15570 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
15580 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  .**        colum
15590 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ns of the sub-qu
155a0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29  ery..**.**  (19)
155b0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
155c0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
155d0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
155e0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
155f0 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
15600 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
15610 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
15620 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
15630 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
15640 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
15650 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
15660 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
15670 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
15680 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
15690 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
156a0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
156b0 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
156c0 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
156d0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
156e0 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
156f0 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
15700 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
15710 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
15720 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
15730 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
15740 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74   other optimizat
15750 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20  ions in mind to 
15760 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63  deal with that c
15770 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ase..**.** In th
15780 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
15790 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
157a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
157b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
157c0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
157d0 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
157e0 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
157f0 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
15800 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
15810 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
15820 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
15830 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
15840 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
15850 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
15860 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
15870 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
15880 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
15890 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
158a0 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
158b0 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
158c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
158d0 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
158e0 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
158f0 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
15900 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
15910 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
15920 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
15930 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
15940 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
15950 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
15960 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
15970 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15980 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15990 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
159a0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
159b0 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
159c0 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
159d0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
159e0 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
159f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
15a00 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
15a10 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
15a20 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
15a30 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
15a40 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
15a50 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
15a60 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
15a70 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
15a80 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
15a90 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
15aa0 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
15ab0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
15ac0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
15ad0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
15ae0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
15af0 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  text;.  Select *
15b00 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63  pParent;.  Selec
15b10 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
15b20 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
15b30 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
15b40 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
15b50 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  b1;      /* Poin
15b60 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
15b70 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73  most select in s
15b80 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  ub-query */.  Sr
15b90 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
15ba0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
15bb0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
15bc0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
15bd0 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
15be0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
15bf0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
15c00 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
15c10 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
15c20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
15c30 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
15c40 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
15c50 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
15c60 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
15c70 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
15c80 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
15c90 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15cb0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15cc0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ce0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
15cf0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
15d00 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
15d10 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
15d20 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
15d30 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15d40 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
15d50 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
15d60 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
15d70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
15d80 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
15d90 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
15da0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
15db0 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a  pPrior==0 );  /*
15dc0 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74   Unable to flatt
15dd0 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  en compound quer
15de0 69 65 73 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  ies */.  pSrc = 
15df0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
15e00 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
15e10 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
15e20 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
15e30 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
15e40 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
15e50 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
15e60 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
15e70 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
15e80 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
15e90 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
15ea0 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
15eb0 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
15ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15ed0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
15ee0 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73   (1)  */.  if( s
15ef0 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
15f00 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
15f10 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
15f20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
15f30 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53   (2)  */.  pSubS
15f40 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
15f50 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
15f60 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
15f70 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
15f80 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
15f90 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
15fa0 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
15fb0 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
15fc0 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73  bitrary expresss
15fd0 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
15fe0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
15ff0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
16000 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
16010 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
16020 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
16030 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
16040 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
16050 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
16060 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
16070 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
16080 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
16090 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
160a0 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
160b0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
160c0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
160d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
160e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
160f0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
16100 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
16110 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16140 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
16150 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
16160 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c  most && pSub->pL
16170 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f  imit && pSub->pO
16180 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
16190 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
161d0 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (15) */.  }.  
161e0 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
161f0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
16220 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
16230 69 66 28 20 28 28 70 53 75 62 2d 3e 73 65 6c 46  if( ((pSub->selF
16240 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
16250 63 74 29 21 3d 30 20 7c 7c 20 70 53 75 62 2d 3e  ct)!=0 || pSub->
16260 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20  pLimit) .       
16270 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63    && (pSrc->nSrc
16280 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20  >1 || isAgg) ){ 
16290 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
162a0 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28  rictions (4)(5)(
162b0 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65  8)(9) */.     re
162c0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20  turn 0;       . 
162d0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
162e0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
162f0 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
16300 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
16310 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
16320 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
16330 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
16340 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
16350 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
16360 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
16370 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
163a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
163b0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
163c0 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
163d0 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
163e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
163f0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16400 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
16410 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
16420 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
16430 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
16440 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16450 20 28 31 39 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   (19) */..  /* O
16460 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
16470 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  1:.  ** Restrict
16480 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73  ion 3:  If the s
16490 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
164a0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
164b0 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20   subquery is .  
164c0 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74  ** not used as t
164d0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
164e0 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69   of an outer joi
164f0 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  n.  Examples of 
16500 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73  why this.  ** is
16510 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
16520 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
16530 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
16540 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
16550 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
16560 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
16570 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
16580 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
16590 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
165a0 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
165b0 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
165c0 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
165d0 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
165e0 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45    **.  ** OBSOLE
165f0 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20  TE COMMENT 2:.  
16600 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  ** Restriction 1
16610 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  2:  If the subqu
16620 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
16630 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
16640 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f  ft outer.  ** jo
16650 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
16660 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e  e subquery has n
16670 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  o WHERE clause..
16680 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73    ** An examples
16690 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
166a0 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
166b0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
166c0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
166d0 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
166e0 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30   t2 WHERE t2.x>0
166f0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
16700 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
16710 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
16720 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
16730 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
16740 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52  ER JOIN t2) WHER
16750 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20  E t2.x>0.  **.  
16760 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e  ** But the t2.x>
16770 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61  0 test will alwa
16780 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c  ys fail on a NUL
16790 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69  L row of t2, whi
167a0 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  ch.  ** effectiv
167b0 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65  ely converts the
167c0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f   OUTER JOIN into
167d0 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a   an INNER JOIN..
167e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f    **.  ** THIS O
167f0 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54  VERRIDES OBSOLET
16800 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44  E COMMENTS 1 AND
16810 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54   2 ABOVE:.  ** T
16820 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77  icket #3300 show
16830 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e  s that flattenin
16840 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  g the right term
16850 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a   of a LEFT JOIN.
16860 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20    ** is fraught 
16870 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65  with danger.  Be
16880 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  st to avoid the 
16890 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66  whole thing.  If
168a0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
168b0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
168c0 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
168d0 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  OIN, then do not
168e0 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   flatten..  */. 
168f0 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
16900 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
16910 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  TER)!=0 ){.    r
16920 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
16930 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
16940 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  7: If the sub-qu
16950 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
16960 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
16970 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
16980 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
16990 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
169a0 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
169b0 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
169c0 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
169d0 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
169e0 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
169f0 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
16a00 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
16a10 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
16a20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
16a30 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
16a40 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
16a50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16a60 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
16a70 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a  ion 20 */.    }.
16a80 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c      if( isAgg ||
16a90 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
16aa0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
16ab0 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  || pSrc->nSrc!=1
16ac0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16ad0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
16ae0 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53  r(pSub1=pSub; pS
16af0 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31  ub1; pSub1=pSub1
16b00 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
16b10 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
16b20 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
16b30 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
16b40 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
16b50 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
16b60 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
16b70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
16b80 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
16b90 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
16ba0 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
16bb0 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  if( (pSub1->selF
16bc0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
16bd0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
16be0 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ))!=0.       || 
16bf0 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
16c00 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
16c10 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  ALL) .       || 
16c20 4e 45 56 45 52 28 70 53 75 62 31 2d 3e 70 53 72  NEVER(pSub1->pSr
16c30 63 3d 3d 30 29 20 7c 7c 20 70 53 75 62 31 2d 3e  c==0) || pSub1->
16c40 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a 20 20  pSrc->nSrc!=1.  
16c50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
16c60 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
16c70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
16c80 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a  estriction 18. *
16c90 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
16ca0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
16cb0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
16cc0 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
16cd0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
16ce0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
16cf0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
16d00 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20 72 65  ii].iCol==0 ) re
16d10 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
16d20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
16d30 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
16d40 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
16d50 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
16d60 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f  ted. *****/..  /
16d70 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
16d80 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
16d90 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
16da0 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
16db0 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 41  Name;.  sqlite3A
16dc0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
16dd0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
16de0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50 61 72  0, 0, 0);.  pPar
16df0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
16e00 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
16e10 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
16e20 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
16e30 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
16e40 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
16e50 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f  n (by restrictio
16e60 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31  ns.  ** 17 and 1
16e70 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74  8 above) it must
16e80 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   be a UNION ALL 
16e90 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71  and the parent q
16ea0 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20  uery must .  ** 
16eb0 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  be of the form:.
16ec0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
16ed0 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e  LECT <expr-list>
16ee0 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72   FROM (<sub-quer
16ef0 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73  y>) <where-claus
16f00 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f  e> .  **.  ** fo
16f10 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52  llowed by any OR
16f20 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e  DER BY, LIMIT an
16f30 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75  d/or OFFSET clau
16f40 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ses. This block.
16f50 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31    ** creates N-1
16f60 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
16f70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
16f80 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
16f90 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
16fa0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
16fb0 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
16fc0 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
16fd0 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
16fe0 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
16ff0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
17000 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
17010 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
17020 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
17030 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
17040 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
17050 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
17060 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
17070 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
17080 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28  ELECT a+1 FROM (
17090 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
170a0 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20  ECT x FROM tab. 
170b0 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
170c0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
170d0 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
170e0 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
170f0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
17100 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
17110 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20  z*2) FROM tab2. 
17120 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20   **     ) WHERE 
17130 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  a!=5 ORDER BY 1.
17140 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66    **.  ** Transf
17150 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  ormed into:.  **
17160 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
17170 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   x+1 FROM tab WH
17180 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE x+1!=5.  ** 
17190 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
171a0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b  **     SELECT y+
171b0 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
171c0 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   y+1!=5.  **    
171d0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
171e0 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
171f0 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20  *2)+1 FROM tab2 
17200 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31  WHERE abs(z*2)+1
17210 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44  !=5.  **     ORD
17220 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
17230 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74  * We call this t
17240 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  he "compound-sub
17250 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
17260 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53  "..  */.  for(pS
17270 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b  ub=pSub->pPrior;
17280 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62   pSub; pSub=pSub
17290 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53  ->pPrior){.    S
172a0 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20  elect *pNew;.   
172b0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
172c0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
172d0 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69  y;.    Expr *pLi
172e0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
172f0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72  .    Select *pPr
17300 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
17310 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
17320 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72   = 0;.    p->pSr
17330 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50  c = 0;.    p->pP
17340 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rior = 0;.    p-
17350 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
17360 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
17370 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
17380 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  0);.    p->pLimi
17390 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
173a0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
173b0 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
173c0 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
173d0 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
173e0 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
173f0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  t = 0;.    if( p
17400 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
17410 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20  pNew = pPrior;. 
17420 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17430 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
17440 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65  Prior;.      pNe
17450 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
17460 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  0;.    }.    p->
17470 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
17480 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
17490 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
174a0 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
174b0 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
174c0 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
174d0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
174e0 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
174f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
17500 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
17510 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
17520 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
17530 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
17540 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
17550 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
17560 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
17570 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
17580 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
17590 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
175a0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
175b0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
175c0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
175d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
175e0 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
175f0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
17600 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
17610 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
17620 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
17630 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
17640 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
17650 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
17660 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
17670 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
17680 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
17690 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
176a0 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
176b0 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
176c0 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
176d0 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
176e0 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
176f0 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
17700 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
17710 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
17720 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
17730 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
17740 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
17750 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
17760 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
17770 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
17780 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
17790 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
177a0 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
177b0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
177c0 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
177d0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
177e0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
177f0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
17800 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
17810 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
17820 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
17830 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
17840 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
17850 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
17860 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
17870 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
17880 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
17890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
178a0 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b  abToDel->nRef--;
178b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
178c0 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
178d0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
178e0 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
178f0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
17900 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
17910 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
17920 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
17930 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
17940 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
17950 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
17960 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
17970 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
17980 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
17990 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
179a0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
179b0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
179c0 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
179d0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
179e0 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
179f0 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
17a00 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
17a10 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
17a20 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
17a30 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
17a40 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
17a50 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
17a60 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
17a70 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
17a80 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
17a90 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
17aa0 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
17ab0 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
17ac0 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
17ad0 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
17ae0 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
17af0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
17b00 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
17b10 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
17b20 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
17b30 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
17b40 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
17b50 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
17b60 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
17b70 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
17b80 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
17b90 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
17ba0 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
17bb0 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
17bc0 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
17bd0 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
17be0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
17bf0 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
17c00 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
17c10 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
17c20 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
17c30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
17c40 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
17c50 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
17c60 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
17c70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
17c80 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
17c90 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
17ca0 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
17cb0 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
17cc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
17cd0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17ce0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
17cf0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
17d00 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
17d10 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
17d20 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
17d30 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
17d40 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  e = pSubitem->jo
17d50 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
17d60 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
17d70 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
17d80 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
17d90 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
17da0 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
17db0 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
17dc0 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
17dd0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
17de0 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
17df0 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
17e00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
17e10 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
17e20 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
17e30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17e40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
17e50 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
17e60 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
17e70 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
17e80 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
17e90 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
17ea0 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
17eb0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
17ec0 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
17ed0 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
17ee0 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
17ef0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
17f00 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
17f10 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
17f20 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
17f30 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
17f40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
17f50 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
17f60 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
17f70 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
17f80 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
17f90 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
17fa0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
17fb0 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
17fc0 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
17fd0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
17fe0 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
17ff0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
18000 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
18010 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
18020 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
18030 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
18040 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
18050 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75  xpand the out qu
18060 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20  ery to 4 slots. 
18070 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20   The middle.    
18080 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  ** slot is expan
18090 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
180a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
180b0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a  e space for the.
180c0 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65      ** two eleme
180d0 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
180e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
180f0 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
18100 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
18110 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
18120 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
18130 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
18140 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
18150 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
18160 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
18170 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18180 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
18190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
181a0 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
181b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
181c0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
181d0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
181e0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
181f0 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
18200 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
18210 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
18220 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
18230 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
18240 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
18250 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
18260 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
18270 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
18280 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
18290 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
182a0 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
182b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
182c0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
182d0 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
182e0 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
182f0 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
18300 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
18310 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
18320 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
18330 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
18340 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
18350 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
18360 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
18370 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
18380 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
18390 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
183a0 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
183b0 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
183c0 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
183d0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
183e0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
183f0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
18400 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
18410 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
18420 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
18430 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
18440 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
18450 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18460 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
18470 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
18480 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
18490 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
184a0 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
184b0 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
184c0 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
184d0 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
184e0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
184f0 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
18500 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
18510 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
18520 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
18530 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
18540 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
18550 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
18560 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
18570 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
18580 63 68 61 72 20 2a 7a 53 70 61 6e 20 3d 20 70 4c  char *zSpan = pL
18590 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
185a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57  .        if( ALW
185b0 41 59 53 28 7a 53 70 61 6e 29 20 29 7b 0a 20 20  AYS(zSpan) ){.  
185c0 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
185d0 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
185e0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
185f0 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
18600 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
18610 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
18620 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
18630 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
18640 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
18650 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a     if( isAgg ){.
18660 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
18670 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
18680 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
18690 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
186a0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
186b0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
186c0 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
186d0 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
186e0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
186f0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
18700 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
18710 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
18720 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
18730 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
18740 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
18750 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
18760 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
18770 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
18780 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
18790 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ent->pOrderBy ){
187a0 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
187b0 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
187c0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
187d0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
187e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
187f0 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
18800 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
18810 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
18820 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
18830 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
18840 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
18850 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
18860 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
18870 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18880 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
18890 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
188a0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
188b0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b  pParent->pWhere;
188c0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
188d0 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
188e0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
188f0 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
18900 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
18910 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
18920 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
18930 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
18940 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
18950 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
18960 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
18970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18990 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
189a0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76  p(db, pSub->pHav
189b0 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ing, 0));.      
189c0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
189d0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
189e0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
189f0 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
18a00 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
18a10 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c   pSub->pGroupBy,
18a20 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
18a30 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
18a40 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
18a50 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
18a60 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
18a70 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
18a80 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
18a90 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
18aa0 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
18ab0 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  t->pWhere, pWher
18ac0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
18ad0 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
18ae0 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
18af0 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
18b00 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
18b10 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
18b20 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
18b30 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65      */.    pPare
18b40 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  nt->selFlags |= 
18b50 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
18b60 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   SF_Distinct;.  
18b70 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
18b80 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
18b90 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
18ba0 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
18bb0 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
18bc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
18bd0 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
18be0 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
18bf0 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
18c00 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
18c10 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
18c20 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
18c30 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
18c40 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
18c50 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
18c60 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
18c70 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
18c80 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
18c90 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
18ca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18cb0 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
18cc0 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
18cd0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
18ce0 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
18cf0 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
18d00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
18d10 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
18d20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
18d30 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
18d40 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
18d50 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
18d60 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
18d70 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
18d80 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45  Analyze the SELE
18d90 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
18da0 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
18db0 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
18dc0 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72  ** is a min() or
18dd0 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 52 65   max() query. Re
18de0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
18df0 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
18e00 4f 52 44 45 52 42 59 5f 4d 41 58 20 69 66 20 0a  ORDERBY_MAX if .
18e10 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20 30 20 6f  ** it is, or 0 o
18e20 74 68 65 72 77 69 73 65 2e 20 41 74 20 70 72 65  therwise. At pre
18e30 73 65 6e 74 2c 20 61 20 71 75 65 72 79 20 69 73  sent, a query is
18e40 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
18e50 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78  e.** a min()/max
18e60 28 29 20 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a  () query if:.**.
18e70 2a 2a 20 20 20 31 2e 20 54 68 65 72 65 20 69 73  **   1. There is
18e80 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74   a single object
18e90 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
18ea0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  use..**.**   2. 
18eb0 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c  There is a singl
18ec0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
18ed0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
18ee0 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20 20 20  and it is.**    
18ef0 20 20 65 69 74 68 65 72 20 6d 69 6e 28 78 29 20    either min(x) 
18f00 6f 72 20 6d 61 78 28 78 29 2c 20 77 68 65 72 65  or max(x), where
18f10 20 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72   x is a column r
18f20 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  eference..*/.sta
18f30 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65  tic u8 minMaxQue
18f40 72 79 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ry(Select *p){. 
18f50 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
18f60 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
18f70 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
18f80 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
18f90 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 57  pr!=1 ) return W
18fa0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
18fb0 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  MAL;.  pExpr = p
18fc0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
18fd0 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
18fe0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
18ff0 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
19000 20 20 69 66 28 20 4e 45 56 45 52 28 45 78 70 72    if( NEVER(Expr
19010 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
19020 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
19030 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
19040 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
19050 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  x.pList;.  if( p
19060 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69  EList==0 || pELi
19070 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
19080 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
19090 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
190a0 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  r->op!=TK_AGG_CO
190b0 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48  LUMN ) return WH
190c0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
190d0 41 4c 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  AL;.  assert( !E
190e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
190f0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
19100 65 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  e) );.  if( sqli
19110 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
19120 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 69 6e 22  ->u.zToken,"min"
19130 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
19140 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
19150 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _MIN;.  }else if
19160 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
19170 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
19180 2c 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"max")==0 ){.  
19190 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
191a0 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a  RDERBY_MAX;.  }.
191b0 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
191c0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d  RDERBY_NORMAL;.}
191d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
191e0 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
191f0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
19200 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
19210 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
19220 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
19230 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  rgment is the as
19240 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
19250 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
19260 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
19270 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
19280 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
19290 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
192a0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
192b0 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
192c0 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
192d0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
192e0 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
192f0 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
19300 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
19310 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
19320 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
19330 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
19340 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
19350 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
19360 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
19370 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
19380 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
19390 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
193a0 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
193b0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
193c0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
193d0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
193e0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
193f0 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
19400 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
19410 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
19420 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
19430 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
19440 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
19450 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
19460 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
19470 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
19480 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
19490 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
194a0 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
194b0 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
194c0 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
194d0 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
194e0 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
194f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
19500 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
19510 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
19520 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
19530 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
19540 46 75 6e 63 2d 3e 66 6c 61 67 73 26 53 51 4c 49  Func->flags&SQLI
19550 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
19560 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
19570 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
19580 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
19590 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
195a0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
195b0 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
195c0 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
195d0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
195e0 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
195f0 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
19600 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
19610 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
19620 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
19630 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
19640 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
19650 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
19660 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
19670 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
19680 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
19690 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
196a0 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
196b0 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
196c0 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
196d0 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
196e0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
196f0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
19700 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
19710 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
19720 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
19730 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
19740 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a  pTab && pFrom->z
19750 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62  Index ){.    Tab
19760 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
19770 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
19780 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d   *zIndex = pFrom
19790 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e  ->zIndex;.    In
197a0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
197b0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
197c0 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70  ndex; .        p
197d0 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74  Idx && sqlite3St
197e0 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d  rICmp(pIdx->zNam
197f0 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20  e, zIndex); .   
19800 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e       pIdx=pIdx->
19810 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20  pNext.    );.   
19820 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
19830 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19840 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
19850 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c  such index: %s",
19860 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20   zIndex, 0);.   
19870 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19880 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
19890 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20    pFrom->pIndex 
198a0 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
198b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
198c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
198d0 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
198e0 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
198f0 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
19900 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
19910 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
19920 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
19930 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
19940 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
19950 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
19960 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
19970 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
19980 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
19990 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
199a0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
199b0 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
199c0 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
199d0 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
199e0 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
199f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
19a00 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
19a10 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
19a20 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
19a30 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
19a40 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
19a50 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
19a60 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
19a70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
19a80 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
19a90 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
19aa0 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
19ab0 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
19ac0 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
19ad0 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
19ae0 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
19af0 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
19b00 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
19b10 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
19b20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
19b30 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
19b40 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
19b50 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
19b60 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
19b70 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
19b80 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
19b90 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
19ba0 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
19bb0 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
19bc0 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
19bd0 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
19be0 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
19bf0 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
19c00 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
19c10 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
19c20 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
19c30 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
19c40 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
19c50 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
19c60 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
19c70 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
19c80 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
19c90 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
19ca0 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
19cb0 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
19cc0 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
19cd0 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
19ce0 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
19cf0 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
19d00 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
19d10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
19d20 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
19d30 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
19d40 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
19d50 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
19d60 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
19d70 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
19d80 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
19d90 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
19da0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
19db0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
19dc0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
19dd0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
19de0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19df0 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72  Failed  ){.    r
19e00 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
19e10 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52  .  }.  if( NEVER
19e20 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20  (p->pSrc==0) || 
19e30 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
19e40 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
19e50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
19e60 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 2d  _Prune;.  }.  p-
19e70 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
19e80 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54 61 62  Expanded;.  pTab
19e90 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
19ea0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
19eb0 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  List;..  /* Make
19ec0 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
19ed0 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
19ee0 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
19ef0 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
19f00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
19f10 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
19f20 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
19f30 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
19f40 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
19f50 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
19f60 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
19f70 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
19f80 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19f90 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
19fa0 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
19fb0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
19fc0 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
19fd0 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
19fe0 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
19ff0 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
1a000 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
1a010 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
1a020 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
1a030 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
1a040 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
1a050 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
1a060 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1a070 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
1a080 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
1a090 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
1a0a0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
1a0b0 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
1a0c0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
1a0d0 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
1a0e0 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
1a0f0 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
1a100 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1a110 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
1a120 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
1a130 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1a140 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
1a150 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
1a160 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1a170 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
1a180 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
1a190 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
1a1a0 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
1a1b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1a1c0 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
1a1d0 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
1a1e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1a1f0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
1a200 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1a210 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
1a220 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
1a230 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
1a240 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
1a250 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1a260 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
1a270 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1a280 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1a290 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
1a2a0 62 2d 3e 64 62 4d 65 6d 20 3d 20 64 62 2d 3e 6c  b->dbMem = db->l
1a2b0 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
1a2c0 64 20 3f 20 64 62 20 3a 20 30 3b 0a 20 20 20 20  d ? db : 0;.    
1a2d0 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
1a2e0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ;.      pTab->zN
1a2f0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
1a300 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
1a310 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20  _subquery_%p_", 
1a320 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20  (void*)pTab);.  
1a330 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
1a340 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
1a350 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
1a360 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43 6f  }.      selectCo
1a370 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
1a380 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  t(pParse, pSel->
1a390 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
1a3a0 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
1a3b0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  );.      pTab->i
1a3c0 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20  PKey = -1;.     
1a3d0 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
1a3e0 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
1a3f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1a400 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
1a410 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
1a420 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
1a430 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1a440 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a450 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
1a460 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
1a470 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
1a480 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
1a490 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30  teTable(pParse,0
1a4a0 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46  ,pFrom->zName,pF
1a4b0 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  rom->zDatabase);
1a4c0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1a4d0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1a4e0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
1a4f0 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
1a500 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1a510 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
1a520 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
1a530 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
1a540 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
1a550 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
1a560 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1a570 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
1a580 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
1a590 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
1a5a0 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
1a5b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1a5c0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
1a5d0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1a5e0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
1a5f0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
1a600 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1a610 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
1a620 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
1a630 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
1a640 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
1a650 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
1a660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
1a670 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1a680 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
1a690 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1a6a0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
1a6b0 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
1a6c0 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
1a6d0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
1a6e0 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
1a6f0 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
1a700 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
1a710 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
1a720 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
1a730 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
1a740 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
1a750 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
1a760 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
1a770 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
1a780 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
1a790 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
1a7a0 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
1a7b0 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
1a7c0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1a7d0 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
1a7e0 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
1a7f0 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
1a800 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
1a810 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
1a820 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
1a830 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
1a840 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
1a850 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
1a860 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
1a870 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
1a880 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
1a890 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
1a8a0 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
1a8b0 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
1a8c0 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
1a8d0 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
1a8e0 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
1a8f0 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
1a900 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
1a910 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
1a920 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
1a930 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
1a940 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
1a950 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
1a960 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
1a970 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
1a980 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
1a990 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
1a9a0 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
1a9b0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
1a9c0 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
1a9d0 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
1a9e0 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
1a9f0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
1aa00 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
1aa10 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
1aa20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
1aa30 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
1aa40 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
1aa50 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
1aa60 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1aa70 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
1aa80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1aa90 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1aaa0 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
1aab0 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
1aac0 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
1aad0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
1aae0 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
1aaf0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
1ab00 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
1ab10 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
1ab20 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
1ab30 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
1ab40 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
1ab50 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
1ab60 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
1ab70 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
1ab80 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1ab90 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
1aba0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
1abb0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
1abc0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1abd0 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
1abe0 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
1abf0 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
1ac00 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
1ac10 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
1ac20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
1ac30 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
1ac40 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
1ac50 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
1ac60 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
1ac70 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
1ac80 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aca0 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
1acb0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
1acc0 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
1acd0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
1ace0 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
1acf0 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
1ad00 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
1ad10 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
1ad20 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1ad30 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
1ad40 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
1ad50 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70  K_ALL && (pE->op
1ad60 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1ad70 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
1ad80 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
1ad90 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
1ada0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
1adb0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1adc0 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
1add0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
1ade0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1adf0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1ae00 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
1ae10 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
1ae20 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
1ae30 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
1ae40 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
1ae50 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
1ae60 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
1ae70 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
1ae80 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
1ae90 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
1aea0 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
1aeb0 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
1aec0 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
1aed0 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
1aee0 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
1aef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1af00 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
1af10 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
1af20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
1af30 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
1af40 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
1af50 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
1af60 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
1af70 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
1af80 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
1af90 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
1afa0 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20   *zTName;       
1afb0 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
1afc0 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
1afd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
1afe0 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
1aff0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1b000 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b   pE->pLeft!=0 );
1b010 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1b020 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1b030 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45  rty(pE->pLeft, E
1b040 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1b050 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
1b060 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  = pE->pLeft->u.z
1b070 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  Token;.        }
1b080 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1b090 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  zTName = 0;.    
1b0a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
1b0b0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1b0c0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1b0d0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1b0e0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
1b0f0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1b100 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
1b110 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1b120 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
1b130 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
1b140 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
1b150 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1b160 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
1b170 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
1b180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b190 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1b1a0 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
1b1b0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1b1c0 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
1b1d0 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
1b1e0 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
1b1f0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1b200 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
1b210 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
1b220 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
1b230 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1b240 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1b250 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
1b260 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74   *pExpr, *pRight
1b270 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
1b280 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
1b290 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
1b2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1b2b0 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
1b2c0 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
1b2d0 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
1b2e0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1b2f0 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
1b300 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
1b310 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
1b320 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
1b330 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
1b340 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
1b350 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
1b360 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
1b370 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
1b380 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
1b390 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
1b3a0 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
1b3b0 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
1b3c0 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
1b3d0 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
1b3e0 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
1b3f0 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
1b400 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
1b410 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
1b420 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b430 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
1b440 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
1b450 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
1b460 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1b470 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
1b480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1b490 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1b4a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1b4b0 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
1b4c0 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
1b4e0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1b4f0 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69  *pLeft = &pTabLi
1b500 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20  st->a[i-1];.    
1b510 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1b520 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Left[1].jointype
1b530 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
1b540 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
1b550 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
1b560 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
1b570 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
1b580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b590 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
1b5a0 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
1b5b0 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
1b5c0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
1b5d0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
1b5e0 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
1b5f0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1b600 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1b610 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b620 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
1b630 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
1b640 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67  (pLeft[1].pUsing
1b650 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b670 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
1b680 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
1b690 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
1b6a0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
1b6b0 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
1b6c0 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
1b6d0 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
1b6e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1b6f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1b710 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1b720 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
1b730 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
1b740 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b  , TK_ID, zName);
1b750 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
1b760 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  lname = zName;. 
1b770 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
1b780 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ee = 0;.        
1b790 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
1b7a0 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
1b7b0 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
1b7c0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
1b7d0 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
1b7e0 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
1b7f0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
1b800 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
1b810 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1b820 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1b830 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
1b840 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
1b850 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b860 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
1b870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b880 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69   zColname = sqli
1b890 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1b8a0 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
1b8b0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1b8c0 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
1b8d0 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  e = zColname;.  
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b8f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1b900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1b910 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
1b920 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1b930 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
1b940 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1b950 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
1b960 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
1b970 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65          sColname
1b980 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  .z = zColname;. 
1b990 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e             sColn
1b9a0 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53  ame.n = sqlite3S
1b9b0 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65  trlen30(zColname
1b9c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1b9d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
1b9e0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
1b9f0 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
1ba00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1ba10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ba20 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
1ba30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1ba40 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
1ba50 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
1ba60 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
1ba70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1ba80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ba90 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1baa0 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
1bab0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
1bac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1bad0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1bae0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
1baf0 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
1bb00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1bb10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1bb20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1bb30 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1bb40 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
1bb50 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
1bb60 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
1bb70 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
1bb80 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
1bb90 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
1bba0 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
1bbb0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
1bbc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1bbd0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1bbe0 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
1bbf0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
1bc00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1bc10 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1bc20 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
1bc30 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
1bc40 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
1bc50 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
1bc60 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1bc70 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
1bc80 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
1bc90 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1bca0 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
1bcb0 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
1bcc0 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
1bcd0 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
1bce0 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
1bcf0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1bd00 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
1bd10 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
1bd20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
1bd30 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1bd40 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
1bd50 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
1bd60 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
1bd70 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
1bd80 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  er tree..*/.stat
1bd90 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e  ic int exprWalkN
1bda0 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
1bdb0 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73  sed, Expr *NotUs
1bdc0 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
1bdd0 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
1bde0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
1bdf0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1be00 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nue;.}../*.** Th
1be10 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61  is routine "expa
1be20 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74  nds" a SELECT st
1be30 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20  atement and all 
1be40 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65  of its subquerie
1be50 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69  s..** For additi
1be60 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1be70 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e   on what it mean
1be80 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20  s to "expand" a 
1be90 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
1bea0 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d  ent, see the com
1beb0 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65  ment on the sele
1bec0 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20  ctExpand worker 
1bed0 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a  callback above..
1bee0 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20  **.** Expanding 
1bef0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1bf00 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
1bf10 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69  step in processi
1bf20 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  ng a.** SELECT s
1bf30 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53  tatement.  The S
1bf40 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1bf50 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
1bf60 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20   before.** name 
1bf70 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65  resolution is pe
1bf80 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  rformed..**.** I
1bf90 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
1bfa0 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20  wrong, an error 
1bfb0 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
1bfc0 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a  en into pParse..
1bfd0 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
1bfe0 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65  unction can dete
1bff0 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62  ct the problem b
1c000 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61  y looking at pPa
1c010 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64  rse->nErr.** and
1c020 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  /or pParse->db->
1c030 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f  mallocFailed..*/
1c040 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1c050 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
1c060 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c070 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
1c080 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
1c090 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
1c0a0 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64  k = selectExpand
1c0b0 65 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  er;.  w.xExprCal
1c0c0 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b  lback = exprWalk
1c0d0 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
1c0e0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
1c0f0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
1c100 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
1c110 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c120 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
1c130 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
1c140 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
1c150 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
1c160 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
1c170 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
1c180 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
1c190 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
1c1a0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
1c1b0 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
1c1c0 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
1c1d0 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
1c1e0 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
1c1f0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
1c200 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
1c210 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
1c220 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
1c230 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
1c240 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
1c250 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
1c260 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
1c270 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
1c280 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
1c290 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
1c2a0 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
1c2b0 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
1c2c0 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
1c2d0 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
1c2e0 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
1c2f0 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
1c300 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
1c310 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
1c320 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
1c330 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
1c340 63 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53  c int selectAddS
1c350 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
1c360 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1c370 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
1c380 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
1c390 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
1c3a0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
1c3b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c3c0 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
1c3d0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
1c3e0 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
1c3f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
1c400 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
1c410 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b  sTypeInfo)==0 );
1c420 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
1c430 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  = SF_HasTypeInfo
1c440 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ;.  pParse = pWa
1c450 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
1c460 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
1c470 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  rc;.  for(i=0, p
1c480 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
1c490 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1c4a0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
1c4b0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1c4c0 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
1c4d0 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  ;.    if( ALWAYS
1c4e0 28 70 54 61 62 21 3d 30 29 20 26 26 20 28 70 54  (pTab!=0) && (pT
1c4f0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
1c500 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
1c510 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ){.      /* A su
1c520 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
1c530 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
1c540 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
1c550 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
1c560 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
1c570 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
1c580 6c 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  l );.      while
1c590 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
1c5a0 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
1c5b0 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 65 6c 65  rior;.      sele
1c5c0 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
1c5d0 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
1c5e0 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  se, pTab->nCol, 
1c5f0 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c  pTab->aCol, pSel
1c600 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1c610 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1c620 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ue;.}.#endif.../
1c630 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c640 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20  e adds datatype 
1c650 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
1c660 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  quence informati
1c670 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62  on to.** the Tab
1c680 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  le structures of
1c690 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
1c6a0 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61   subqueries in a
1c6b0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
1c6c0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  ment..**.** Use 
1c6d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74  this routine aft
1c6e0 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
1c6f0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1c700 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
1c710 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73  AddTypeInfo(Pars
1c720 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
1c730 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66  t *pSelect){.#if
1c740 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c750 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b  _SUBQUERY.  Walk
1c760 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63  er w;.  w.xSelec
1c770 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
1c780 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
1c790 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
1c7a0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
1c7b0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
1c7c0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
1c7d0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1c7e0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
1c7f0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
1c800 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
1c810 74 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  ts of a SELECT s
1c820 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
1c830 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
1c840 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
1c850 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
1c860 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
1c870 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
1c880 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
1c890 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
1c8a0 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
1c8b0 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
1c8c0 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
1c8d0 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
1c8e0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
1c8f0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
1c900 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1c910 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
1c920 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
1c930 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
1c940 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
1c950 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
1c960 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
1c970 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
1c980 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
1c990 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
1c9a0 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
1c9b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1c9c0 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
1c9d0 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
1c9e0 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
1c9f0 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
1ca00 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
1ca10 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
1ca20 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
1ca30 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
1ca40 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1ca50 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1ca60 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
1ca70 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
1ca80 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
1ca90 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
1caa0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
1cab0 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
1cac0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
1cad0 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  db;.  if( NEVER(
1cae0 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  p==0) ) return;.
1caf0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1cb00 62 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  b;.  if( p->selF
1cb10 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
1cb20 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a  eInfo ) return;.
1cb30 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45    sqlite3SelectE
1cb40 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29  xpand(pParse, p)
1cb50 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1cb60 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
1cb70 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1cb80 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  n;.  sqlite3Reso
1cb90 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70  lveSelectNames(p
1cba0 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72  Parse, p, pOuter
1cbb0 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  NC);.  if( pPars
1cbc0 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
1cbd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1cbe0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
1cbf0 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
1cc00 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a  (pParse, p);.}..
1cc10 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
1cc20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
1cc30 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
1cc40 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
1cc50 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20  ulator is a set 
1cc60 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
1cc70 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74  that hold.** int
1cc80 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
1cc90 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74  s while calculat
1cca0 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
1ccb0 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
1ccc0 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73  ne simply stores
1ccd0 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
1cce0 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65   those memory ce
1ccf0 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lls..*/.static v
1cd00 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c  oid resetAccumul
1cd10 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
1cd20 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
1cd30 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
1cd40 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1cd50 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1cd60 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1cd70 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20  c *pFunc;.  if( 
1cd80 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b  pAggInfo->nFunc+
1cd90 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
1cda0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  n==0 ){.    retu
1cdb0 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rn;.  }.  for(i=
1cdc0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
1cdd0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
1cde0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cdf0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1ce00 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  0, pAggInfo->aCo
1ce10 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a  l[i].iMem);.  }.
1ce20 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67    for(pFunc=pAgg
1ce30 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30  Info->aFunc, i=0
1ce40 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1ce50 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b  unc; i++, pFunc+
1ce60 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
1ce70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ce80 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e  Null, 0, pFunc->
1ce90 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  iMem);.    if( p
1cea0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e  Func->iDistinct>
1ceb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
1cec0 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45   *pE = pFunc->pE
1ced0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
1cee0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1cef0 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65  rty(pE, EP_xIsSe
1cf00 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
1cf10 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d  f( pE->x.pList==
1cf20 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  0 || pE->x.pList
1cf30 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
1cf40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1cf50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44  orMsg(pParse, "D
1cf60 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74  ISTINCT aggregat
1cf70 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61  es must have exa
1cf80 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20  ctly one ".     
1cf90 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22        "argument"
1cfa0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  );.        pFunc
1cfb0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
1cfc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1cfd0 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
1cfe0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
1cff0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
1d000 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69  Parse, pE->x.pLi
1d010 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  st);.        sql
1d020 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1d030 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1d040 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
1d050 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
1d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d070 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1d080 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
1d090 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
1d0a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
1d0b0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
1d0c0 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65  e OP_AggFinalize
1d0d0 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72   opcode for ever
1d0e0 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
1d0f0 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41  tion.** in the A
1d100 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
1d110 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d120 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
1d130 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61  tions(Parse *pPa
1d140 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
1d150 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
1d160 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1d170 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
1d180 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
1d190 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d  nc *pF;.  for(i=
1d1a0 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
1d1b0 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
1d1c0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
1d1d0 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  F++){.    ExprLi
1d1e0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
1d1f0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
1d200 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1d210 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
1d220 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
1d230 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c  lect) );.    sql
1d240 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1d250 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
1d260 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
1d270 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
1d280 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
1d290 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1d2a0 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
1d2b0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
1d2c0 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
1d2d0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
1d2e0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
1d2f0 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
1d300 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
1d310 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
1d320 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1d330 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
1d340 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
1d350 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1d360 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1d370 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1d380 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1d390 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1d3a0 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
1d3b0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1d3c0 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
1d3d0 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
1d3e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1d3f0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
1d400 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
1d410 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
1d420 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
1d430 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
1d440 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
1d450 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20   int addrNext = 
1d460 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67  0;.    int regAg
1d470 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  g;.    ExprList 
1d480 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
1d490 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
1d4a0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1d4b0 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
1d4c0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1d4d0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
1d4e0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72  ist ){.      nAr
1d4f0 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  g = pList->nExpr
1d500 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
1d510 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1d520 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72  ange(pParse, nAr
1d530 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1d540 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
1d550 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
1d560 20 72 65 67 41 67 67 2c 20 30 29 3b 0a 20 20 20   regAgg, 0);.   
1d570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
1d580 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
1d590 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
1d5a0 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
1d5b0 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
1d5c0 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
1d5d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1d5e0 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
1d5f0 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
1d600 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
1d610 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44  t(pParse, pF->iD
1d620 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
1d630 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20  t, 1, regAgg);. 
1d640 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
1d650 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20  >pFunc->flags & 
1d660 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
1d670 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f  COLL ){.      Co
1d680 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
1d690 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
1d6a0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1d6b0 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  tem;.      int j
1d6c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d6d0 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20  pList!=0 );  /* 
1d6e0 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e  pList!=0 if pF->
1d6f0 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f  pFunc has NEEDCO
1d700 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  LL */.      for(
1d710 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  j=0, pItem=pList
1d720 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a  ->a; !pColl && j
1d730 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65  <nArg; j++, pIte
1d740 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43  m++){.        pC
1d750 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1d760 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1d770 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
1d780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d790 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
1d7a0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72      pColl = pPar
1d7b0 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
1d7c0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
1d7d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d7e0 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
1d7f0 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
1d800 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
1d810 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LSEQ);.    }.   
1d820 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d830 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p4(v, OP_AggStep
1d840 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d  , 0, regAgg, pF-
1d850 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20  >iMem,.         
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1d870 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
1d880 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
1d890 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1d8a0 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29  eP5(v, (u8)nArg)
1d8b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1d8c0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1d8d0 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
1d8e0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1d8f0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1d900 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1d910 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
1d920 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
1d930 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1d940 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1d950 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
1d960 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d970 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
1d980 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
1d990 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
1d9a0 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
1d9b0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
1d9c0 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
1d9d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1d9e0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
1d9f0 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65  ->pExpr, pC->iMe
1da00 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  m);.  }.  pAggIn
1da10 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
1da20 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
1da30 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
1da40 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  se);.}../*.** Ge
1da50 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1da60 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1da70 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
1da80 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
1da90 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
1daa0 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65  s are distribute
1dab0 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79  d in various way
1dac0 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  s depending on t
1dad0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
1dae0 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  f the SelectDest
1daf0 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
1db00 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e  ed to by argumen
1db10 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f  t pDest.** as fo
1db20 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
1db30 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20 20   pDest->eDest   
1db40 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d   Result.**     -
1db50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
1db60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1db70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1db80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
1db90 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20 20    SRT_Output    
1dba0 20 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f 77    Generate a row
1dbb0 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69 6e   of output (usin
1dbc0 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  g the OP_ResultR
1dbd0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
1dbe0 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64 65            opcode
1dbf0 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69  ) for each row i
1dc00 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1dc10 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1dc20 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c 79  Mem         Only
1dc30 20 76 61 6c 69 64 20 69 66 20 74 68 65 20 72 65   valid if the re
1dc40 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c 65  sult is a single
1dc50 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20   column..**     
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 53 74 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  Store the first 
1dc80 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69  column of the fi
1dc90 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a  rst result row.*
1dca0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1dcb0 20 20 20 20 20 20 69 6e 20 72 65 67 69 73 74 65        in registe
1dcc0 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 74  r pDest->iParm t
1dcd0 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  hen abandon the 
1dce0 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  rest.**         
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
1dd00 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
1dd10 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70 6c  destination impl
1dd20 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a 2a  ies "LIMIT 1"..*
1dd30 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74  *.**     SRT_Set
1dd40 20 20 20 20 20 20 20 20 20 54 68 65 20 72 65 73           The res
1dd50 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20 73 69  ult must be a si
1dd60 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53 74  ngle column.  St
1dd70 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20 20 20  ore each.**     
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 61 73  row of result as
1dda0 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61 62 6c   the key in tabl
1ddb0 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 20  e pDest->iParm. 
1ddc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ddd0 20 20 20 20 20 20 20 20 41 70 70 6c 79 20 74 68          Apply th
1dde0 65 20 61 66 66 69 6e 69 74 79 20 70 44 65 73 74  e affinity pDest
1ddf0 2d 3e 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72  ->affinity befor
1de00 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20  e storing.**    
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de20 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65 64 20   results.  Used 
1de30 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49 4e  to implement "IN
1de40 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a   (SELECT ...)"..
1de50 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
1de60 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
1de70 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
1de80 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1de90 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1dea0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
1deb0 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52 65  T_Except      Re
1dec0 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f  move results fro
1ded0 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  m the temporary 
1dee0 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1def0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
1df00 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74  T_Table       St
1df10 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ore results in t
1df20 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
1df30 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 20  Dest->iParm..** 
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65      This is like
1df60 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65 78   SRT_EphemTab ex
1df70 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74 61  cept that the ta
1df80 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ble.**          
1df90 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61 73             is as
1dfa0 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79  sumed to already
1dfb0 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20   be open..**.** 
1dfc0 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62      SRT_EphemTab
1dfd0 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74 65      Create an te
1dfe0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1dff0 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73  est->iParm and s
1e000 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  tore.**         
1e010 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1e020 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68  result there. Th
1e030 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1e040 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20   open after.**  
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e060 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 54     returning.  T
1e070 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f  his is like SRT_
1e080 54 61 62 6c 65 20 65 78 63 65 70 74 20 74 68 61  Table except tha
1e090 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1e0a0 20 20 20 20 20 20 20 20 20 74 68 69 73 20 64 65           this de
1e0b0 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f  stination uses O
1e0c0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1e0d0 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20 20 20  to create.**    
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0f0 20 74 68 65 20 74 61 62 6c 65 20 66 69 72 73 74   the table first
1e100 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1e110 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65 6e 65  Coroutine   Gene
1e120 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e  rate a co-routin
1e130 65 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  e that returns a
1e140 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20   new row of.**  
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 20 20 20 72 65 73 75 6c 74 73 20 65 61 63 68 20     results each 
1e170 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76 6f 6b  time it is invok
1e180 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79 20 70  ed.  The entry p
1e190 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  oint.**         
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
1e1b0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73  he co-routine is
1e1c0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
1e1d0 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ter pDest->iParm
1e1e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1e1f0 45 78 69 73 74 73 20 20 20 20 20 20 53 74 6f 72  Exists      Stor
1e200 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20  e a 1 in memory 
1e210 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72  cell pDest->iPar
1e220 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a  m if the result.
1e230 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e240 20 20 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f         set is no
1e250 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20  t empty..**.**  
1e260 20 20 20 53 52 54 5f 44 69 73 63 61 72 64 20 20     SRT_Discard  
1e270 20 20 20 54 68 72 6f 77 20 74 68 65 20 72 65 73     Throw the res
1e280 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68 69 73  ults away.  This
1e290 20 69 73 20 75 73 65 64 20 62 79 20 53 45 4c 45   is used by SELE
1e2a0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  CT.**           
1e2b0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d            statem
1e2c0 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69 67  ents within trig
1e2d0 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20  gers whose only 
1e2e0 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20  purpose is.**   
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e300 20 20 74 68 65 20 73 69 64 65 2d 65 66 66 65 63    the side-effec
1e310 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e  ts of functions.
1e320 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1e330 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1e340 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1e350 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
1e360 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
1e370 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
1e380 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
1e390 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
1e3a0 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
1e3b0 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
1e3c0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
1e3d0 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
1e3e0 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
1e3f0 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
1e400 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1e410 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
1e420 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e430 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
1e440 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1e450 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
1e460 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1e470 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1e480 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
1e490 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
1e4a0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c   coded. */.  Sel
1e4b0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
1e4c0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
1e4d0 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79  o with the query
1e4e0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
1e4f0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
1e500 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1e510 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
1e520 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
1e530 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66       /* Return f
1e540 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65  rom sqlite3Where
1e550 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62  Begin() */.  Vdb
1e560 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1e570 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
1e580 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
1e590 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1e5a0 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
1e5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e5c0 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
1e5d0 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
1e5e0 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
1e5f0 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
1e600 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
1e610 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
1e620 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
1e630 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
1e640 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
1e650 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
1e660 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
1e670 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1e680 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
1e690 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
1e6a0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1e6b0 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
1e6c0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
1e6d0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
1e6e0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
1e6f0 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
1e700 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
1e710 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1e720 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
1e730 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
1e740 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
1e750 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
1e760 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20  nt isDistinct;  
1e770 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e780 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
1e790 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
1e7a0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
1e7b0 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct;          /* 
1e7c0 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  Table to use for
1e7d0 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
1e7e0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
1e7f0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
1e800 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
1e810 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
1e820 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
1e830 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20  rSortIndex;     
1e840 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e  /* Address of an
1e850 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1e860 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
1e870 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
1e880 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
1e890 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
1e8a0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
1e8b0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
1e8c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1e8d0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1e8e0 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
1e8f0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
1e900 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
1e910 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1e920 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64  nnection */..  d
1e930 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1e940 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62    if( p==0 || db
1e950 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
1e960 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
1e970 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
1e980 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1e990 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1e9a0 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
1e9b0 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
1e9c0 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  urn 1;.  memset(
1e9d0 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69  &sAggInfo, 0, si
1e9e0 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b  zeof(sAggInfo));
1e9f0 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ..  if( Ignorabl
1ea00 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
1ea10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
1ea20 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1ea30 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
1ea40 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
1ea50 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
1ea60 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1ea70 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
1ea80 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
1ea90 69 73 63 61 72 64 29 3b 0a 20 20 20 20 2f 2a 20  iscard);.    /* 
1eaa0 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65  If ORDER BY make
1eab0 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
1eac0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68  in the output th
1ead0 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a  en neither does.
1eae0 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20      ** DISTINCT 
1eaf0 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d  so it can be rem
1eb00 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20  oved too. */.   
1eb10 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1eb20 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
1eb30 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e  rderBy);.    p->
1eb40 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1eb50 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
1eb60 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
1eb70 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
1eb80 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
1eb90 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  , 0);.  pOrderBy
1eba0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
1ebb0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1ebc0 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
1ebd0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
1ebe0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1ebf0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1ec00 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
1ec10 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
1ec20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c   isAgg = (p->sel
1ec30 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
1ec40 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65  gate)!=0;.  asse
1ec50 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
1ec60 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
1ec70 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
1ec80 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
1ec90 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1eca0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
1ecb0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
1ecc0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1ecd0 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
1ece0 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
1ecf0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
1ed00 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1ed10 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1ed20 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1ed30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1ed40 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
1ed50 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
1ed60 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
1ed70 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
1ed80 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1ed90 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
1eda0 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
1edb0 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
1edc0 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
1edd0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
1ede0 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20  nt isAggSub;..  
1edf0 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
1ee00 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
1ee10 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ted ) continue;.
1ee20 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
1ee30 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
1ee40 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
1ee50 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
1ee60 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
1ee70 72 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62  ree refered to b
1ee80 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65  y this, the pare
1ee90 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63  nt select. The c
1eea0 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20  hild select.    
1eeb0 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ** may contain e
1eec0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20  xpression trees 
1eed0 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a  of at most.    *
1eee0 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  * (SQLITE_MAX_EX
1eef0 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e  PR_DEPTH-Parse.n
1ef00 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20  Height) height. 
1ef10 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20  This is a bit.  
1ef20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72    ** more conser
1ef30 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65  vative than nece
1ef40 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20  ssary, but much 
1ef50 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f  easier than enfo
1ef60 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20  rcing.    ** an 
1ef70 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20  exact limit..   
1ef80 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
1ef90 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74  nHeight += sqlit
1efa0 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
1efb0 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ht(p);..    /* C
1efc0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1efd0 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  he subquery can 
1efe0 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
1eff0 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   the parent. */.
1f000 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28      isAggSub = (
1f010 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1f020 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
1f030 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  0;.    if( flatt
1f040 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
1f050 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20  e, p, i, isAgg, 
1f060 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20  isAggSub) ){.   
1f070 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20     if( isAggSub 
1f080 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67  ){.        isAgg
1f090 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
1f0a0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
1f0b0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20  Aggregate;.     
1f0c0 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b   }.      i = -1;
1f0d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f0e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1f0f0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
1f100 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
1f110 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
1f120 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1f130 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3d 3d  m->isPopulated==
1f140 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1f150 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
1f160 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
1f170 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f       pItem->isPo
1f180 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20 20  pulated = 1;.   
1f190 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61   }.    if( /*pPa
1f1a0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64  rse->nErr ||*/ d
1f1b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1f1c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1f1d0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1f1e0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
1f1f0 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
1f200 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
1f210 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  );.    pTabList 
1f220 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
1f230 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
1f240 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
1f250 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
1f260 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
1f270 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
1f280 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
1f290 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
1f2a0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
1f2b0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1f2c0 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
1f2d0 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
1f2e0 44 69 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73  Distinct = (p->s
1f2f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1f300 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e  tinct)!=0;..#ifn
1f310 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f320 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
1f330 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1f340 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
1f350 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
1f360 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
1f370 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
1f380 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1f390 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
1f3a0 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  most==0 ){.     
1f3b0 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20   Select *pLoop, 
1f3c0 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  *pRight = 0;.   
1f3d0 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
1f3e0 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65        int mxSele
1f3f0 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c  ct;.      for(pL
1f400 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
1f410 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
1f420 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20  r, cnt++){.     
1f430 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74     pLoop->pRight
1f440 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  most = p;.      
1f450 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d    pLoop->pNext =
1f460 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
1f470 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b   pRight = pLoop;
1f480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1f490 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c  xSelect = db->aL
1f4a0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
1f4b0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1f4c0 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  T];.      if( mx
1f4d0 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78  Select && cnt>mx
1f4e0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
1f4f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1f500 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
1f510 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d  any terms in com
1f520 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a  pound SELECT");.
1f530 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1f540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f550 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
1f560 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1f570 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 23 65  , pDest);.  }.#e
1f580 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 72  ndif..  /* If wr
1f590 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
1f5a0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
1f5b0 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
1f5c0 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
1f5d0 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
1f5e0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1f5f0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1f600 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
1f610 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
1f620 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
1f630 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
1f640 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
1f650 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
1f660 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f  ndif..  /* If po
1f670 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20  ssible, rewrite 
1f680 74 68 65 20 71 75 65 72 79 20 74 6f 20 75 73 65  the query to use
1f690 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61   GROUP BY instea
1f6a0 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20  d of DISTINCT.. 
1f6b0 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 69 67   ** GROUP BY mig
1f6c0 68 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2c  ht use an index,
1f6d0 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65 72 20   DISTINCT never 
1f6e0 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  does..  */.  ass
1f6f0 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
1f700 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c  ==0 || (p->selFl
1f710 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
1f720 74 65 29 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  te)!=0 );.  if( 
1f730 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
1f740 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1f750 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
1f760 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70  istinct ){.    p
1f770 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1f780 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1f790 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30  db, p->pEList, 0
1f7a0 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  );.    pGroupBy 
1f7b0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
1f7c0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
1f7d0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
1f7e0 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d      isDistinct =
1f7f0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
1f800 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1f810 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
1f820 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a  en this sorting.
1f830 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74    ** index might
1f840 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
1f850 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
1f860 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
1f870 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
1f880 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
1f890 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
1f8a0 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
1f8b0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1f8c0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
1f8d0 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
1f8e0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
1f8f0 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20  .  ** we figure 
1f900 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
1f910 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f  ting index is no
1f920 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61  t needed.  The a
1f930 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a  ddrSortIndex.  *
1f940 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  * variable is us
1f950 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
1f960 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
1f970 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
1f980 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
1f990 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
1f9a0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
1f9b0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
1f9c0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29  Parse, pOrderBy)
1f9d0 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  ;.    pOrderBy->
1f9e0 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
1f9f0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
1fa00 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
1fa10 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65  ] = addrSortInde
1fa20 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
1fa30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1fa40 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
1fa50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
1fa70 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
1fa80 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
1fa90 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  2, 0,.          
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
1fac0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
1fad0 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DOFF);.  }else{.
1fae0 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65      addrSortInde
1faf0 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
1fb00 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
1fb10 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
1fb20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1fb30 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
1fb40 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
1fb50 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1fb60 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
1fb70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fb80 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
1fb90 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69  emeral, pDest->i
1fba0 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
1fbb0 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
1fbc0 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
1fbd0 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
1fbe0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1fbf0 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74  bel(v);.  comput
1fc00 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
1fc10 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
1fc20 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76  ;..  /* Open a v
1fc30 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
1fc40 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
1fc50 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
1fc60 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20   if( isDistinct 
1fc70 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
1fc80 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73  pKeyInfo;.    as
1fc90 73 65 72 74 28 20 69 73 41 67 67 20 7c 7c 20 70  sert( isAgg || p
1fca0 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 64  GroupBy );.    d
1fcb0 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
1fcc0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b  ->nTab++;.    pK
1fcd0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
1fce0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
1fcf0 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  rse, p->pEList);
1fd00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1fd10 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
1fd20 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74  nEphemeral, dist
1fd30 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
1fd60 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
1fd70 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73  HANDOFF);.  }els
1fd80 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  e{.    distinct 
1fd90 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
1fda0 41 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f  Aggregate and no
1fdb0 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
1fdc0 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ies are handled 
1fdd0 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20  differently */. 
1fde0 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
1fdf0 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
1fe00 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69    /* This case i
1fe10 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67  s for non-aggreg
1fe20 61 74 65 20 71 75 65 72 69 65 73 0a 20 20 20 20  ate queries.    
1fe30 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  ** Begin the dat
1fe40 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a  abase scan.    *
1fe50 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
1fe60 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1fe70 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1fe80 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64  t, pWhere, &pOrd
1fe90 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 69 66  erBy, 0);.    if
1fea0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
1feb0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
1fec0 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
1fed0 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
1fee0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1fef0 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ior OP_OpenEphem
1ff00 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  eral .    ** ins
1ff10 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
1ff20 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
1ff30 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
1ff40 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
1ff50 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  eral.    ** into
1ff60 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
1ff70 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72   */.    if( addr
1ff80 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
1ff90 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
1ffa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ffb0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
1ffc0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31  addrSortIndex, 1
1ffd0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
1ffe0 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
1fff0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20000 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
20010 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20   inner loop.    
20020 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21 69  */.    assert(!i
20030 73 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 20 20  sDistinct);.    
20040 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
20050 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
20060 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
20070 79 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20 20  y, -1, pDest,.  
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69    pWInfo->iConti
200a0 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  nue, pWInfo->iBr
200b0 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  eak);..    /* En
200c0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
200d0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
200e0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
200f0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
20100 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
20110 69 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73  is is the proces
20120 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
20130 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
20140 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
20150 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
20160 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
20170 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
20180 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
20190 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
201a0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
201b0 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
201c0 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
201d0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
201e0 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
201f0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
20200 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
20210 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
20220 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
20230 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
20240 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
20250 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
20260 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20280 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
20290 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
202a0 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
202b0 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202d0 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
202e0 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
202f0 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
20300 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
20310 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
20320 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
20330 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
20340 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
20350 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
20360 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
20370 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
20380 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a  drEnd;        /*
20390 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69   End of processi
203a0 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ng for this SELE
203b0 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  CT */..    /* Re
203c0 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c  move any and all
203d0 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e   aliases between
203e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
203f0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  and the.    ** G
20400 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
20410 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
20420 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
20430 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20450 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20460 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
20470 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
20480 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  tem;  /* For loo
20490 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73  ping over expres
204a0 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a  sion in a list *
204b0 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  /..      for(k=p
204c0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
204d0 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74   pItem=p->pEList
204e0 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
204f0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
20500 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d   pItem->iAlias =
20510 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
20520 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79    for(k=pGroupBy
20530 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
20540 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b  GroupBy->a; k>0;
20550 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
20560 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
20570 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
20580 20 7d 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20   }.    }.. .    
20590 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65  /* Create a labe
205a0 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65  l to jump to whe
205b0 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f  n we want to abo
205c0 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  rt the query */.
205d0 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
205e0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
205f0 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
20600 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
20610 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
20620 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
20630 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
20640 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
20650 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
20660 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
20670 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
20680 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
20690 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
206a0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
206b0 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
206c0 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
206d0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
206e0 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
206f0 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
20700 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
20710 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
20720 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
20730 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
20740 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
20750 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67  +1 : 0;.    sAgg
20760 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20  Info.pGroupBy = 
20770 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71  pGroupBy;.    sq
20780 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
20790 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45  AggList(&sNC, pE
207a0 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
207b0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
207c0 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65  List(&sNC, pOrde
207d0 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48  rBy);.    if( pH
207e0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  aving ){.      s
207f0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
20800 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
20810 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  , pHaving);.    
20820 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  }.    sAggInfo.n
20830 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41  Accumulator = sA
20840 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a  ggInfo.nColumn;.
20850 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
20860 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
20870 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
20880 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
20890 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  rty(sAggInfo.aFu
208a0 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  nc[i].pExpr, EP_
208b0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
208c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
208d0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
208e0 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  NC, sAggInfo.aFu
208f0 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  nc[i].pExpr->x.p
20900 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
20910 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
20920 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
20930 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
20940 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
20950 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
20960 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
20970 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
20980 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
20990 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
209a0 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
209b0 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
209c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
209d0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
209e0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
209f0 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
20a00 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
20a10 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
20a20 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20  /.      int j1; 
20a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20a40 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f  -vs-B comparisio
20a50 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20  n jump */.      
20a60 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
20a70 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  w;  /* Start of 
20a80 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
20a90 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
20aa0 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e   row */.      in
20ab0 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20  t regOutputRow; 
20ac0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
20ad0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
20ae0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
20af0 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
20b00 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
20b10 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
20b20 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
20b30 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
20b40 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a  drTopOfLoop;  /*
20b50 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
20b60 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  t loop */.      
20b70 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
20b80 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70  dx; /* The OP_Op
20b90 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20  enEphemeral for 
20ba0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
20bb0 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  x */.      int a
20bc0 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  ddrReset;      /
20bd0 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  * Subroutine for
20be0 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61   resetting the a
20bf0 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20  ccumulator */.  
20c00 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74      int regReset
20c10 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  ;       /* Retur
20c20 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
20c30 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62  er for reset sub
20c40 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20  routine */..    
20c50 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
20c60 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
20c70 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64  se we might need
20c80 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
20c90 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   to.      ** imp
20ca0 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f  lement it.  Allo
20cb0 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e  cate that sortin
20cc0 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66  g index now.  If
20cd0 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20   it turns out.  
20ce0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
20cf0 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66  o not need it af
20d00 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65  ter all, the Ope
20d10 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
20d20 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
20d30 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
20d40 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
20d50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20d60 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
20d70 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
20d80 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
20d90 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
20da0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
20db0 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  e, pGroupBy);.  
20dc0 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
20dd0 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dx = sqlite3Vdbe
20de0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
20df0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20  nEphemeral, .   
20e00 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
20e10 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
20e20 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
20e30 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
20e40 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
20e50 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
20e60 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20  ANDOFF);..      
20e70 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
20e80 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
20e90 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
20ea0 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
20eb0 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
20ec0 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
20ed0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
20ee0 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
20ef0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
20f00 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
20f10 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
20f20 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
20f30 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
20f40 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
20f50 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  l(v);.      regR
20f60 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
20f70 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
20f80 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
20f90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20fa0 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
20fb0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
20fc0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
20fd0 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
20fe0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
20ff0 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
21000 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
21010 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
21020 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
21030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21040 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
21050 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
21060 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
21070 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
21080 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
21090 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
210a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
210b0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
210c0 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
210d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
210e0 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
210f0 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 0a 20  tor empty"));.. 
21100 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
21110 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
21120 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
21130 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
21140 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
21150 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
21160 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
21170 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
21180 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
21190 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
211a0 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
211b0 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
211c0 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
211d0 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
211e0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
211f0 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
21200 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
21210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
21220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21230 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
21240 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
21250 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  t);.      pWInfo
21260 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
21270 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
21280 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
21290 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20  pGroupBy, 0);.  
212a0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
212b0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
212c0 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  end;.      if( p
212d0 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
212e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74        /* The opt
212f0 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74  imizer is able t
21300 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  o deliver rows i
21310 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72  n group by order
21320 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
21330 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
21340 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f   sort.  The OP_O
21350 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62  penEphemeral tab
21360 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
21370 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
21380 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
21390 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
213a0 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
213b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
213c0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
213d0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20  >pGroupBy;.     
213e0 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
213f0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
21400 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
21410 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
21420 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
21430 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
21440 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
21450 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
21460 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
21470 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
21480 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
21490 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
214a0 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
214b0 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
214c0 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
214d0 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
214e0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
214f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21500 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20   int regBase;.  
21510 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
21520 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
21530 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
21540 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20  nt nGroupBy;..  
21550 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
21560 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  t = 1;.        n
21570 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
21580 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
21590 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70     nCol = nGroup
215a0 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  By + 1;.        
215b0 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
215c0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
215d0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
215e0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
215f0 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66       if( sAggInf
21600 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65  o.aCol[i].iSorte
21610 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
21620 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b            nCol++
21630 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
21640 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
21650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21660 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
21670 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
21680 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Parse, nCol);.  
21690 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
216a0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
216b0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
216c0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
216d0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
216e0 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
216f0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
21700 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21710 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41   OP_Sequence, sA
21720 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
21730 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70  x,regBase+nGroup
21740 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  By);.        j =
21750 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20   nGroupBy+1;.   
21760 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
21770 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
21780 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
21790 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
217a0 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
217b0 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
217c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
217d0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
217e0 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
217f0 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
21800 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
21810 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20        int r2;.. 
21820 20 20 20 20 20 20 20 20 20 20 20 72 32 20 3d 20             r2 = 
21830 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
21840 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
21850 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21870 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f   pCol->pTab, pCo
21880 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c  l->iColumn, pCol
21890 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29  ->iTable, r1, 0)
218a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
218b0 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20  ( r1!=r2 ){.    
218c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
218d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
218e0 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29  P_SCopy, r2, r1)
218f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
21900 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
21910 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
21930 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
21940 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
21950 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
21960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
21970 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
21980 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
21990 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
219a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
219b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
219c0 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
219d0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
219e0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
219f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
21a00 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
21a10 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
21a20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
21a30 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
21a40 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
21a50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21a60 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
21a70 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
21a80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21a90 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e   OP_Sort, sAggIn
21aa0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
21ab0 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  ddrEnd);.       
21ac0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21ad0 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22   "GROUP BY sort"
21ae0 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  ));.        sAgg
21af0 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
21b00 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
21b10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21b20 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
21b30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
21b40 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
21b50 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
21b60 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
21b70 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
21b80 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
21b90 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
21ba0 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
21bb0 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
21bc0 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
21bd0 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
21be0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
21bf0 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
21c00 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
21c10 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
21c20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
21c30 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
21c40 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
21c50 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
21c60 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
21c70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
21c80 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
21c90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
21ca0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
21cb0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
21cc0 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
21cd0 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
21ce0 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
21cf0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
21d00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
21d10 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
21d20 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
21d30 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  dx, j, iBMem+j);
21d40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21d50 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
21d60 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
21d70 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
21d80 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
21d90 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
21da0 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
21db0 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
21dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
21dd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
21de0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
21df0 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
21e00 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
21e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
21e30 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
21e40 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  FO);.      j1 = 
21e50 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
21e60 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
21e70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21e80 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
21e90 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a  1+1, 0, j1+1);..
21ea0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
21eb0 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
21ec0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
21ed0 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
21ee0 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
21ef0 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
21f00 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
21f10 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
21f20 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
21f30 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
21f40 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
21f50 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
21f60 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
21f70 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
21f80 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
21f90 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
21fa0 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
21fb0 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
21fc0 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
21fd0 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
21fe0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
21ff0 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
22000 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
22010 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
22020 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
22030 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
22040 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
22050 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
22060 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
22070 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
22080 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
22090 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
220a0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
220b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
220c0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
220d0 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
220e0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
220f0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
22100 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
22110 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
22120 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22130 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
22140 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  lag, addrEnd);. 
22150 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
22160 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
22170 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
22180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22190 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
221a0 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
221b0 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
221c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
221d0 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
221e0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
221f0 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
22200 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
22210 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
22220 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
22230 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
22240 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
22250 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
22260 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
22270 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
22280 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
22290 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
222a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
222b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
222c0 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
222d0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
222e0 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61  , "indicate data
222f0 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
22300 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
22310 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
22320 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
22330 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
22340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22350 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22360 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
22370 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
22380 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
22390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
223a0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
223b0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
223c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
223d0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
223e0 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a  SortingIdx, 1);.
223f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
22400 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
22410 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
22420 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22430 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22440 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
22450 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
22460 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
22470 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22480 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
22490 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
224a0 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
224b0 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
224c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
224d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
224e0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
224f0 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  rEnd);..      /*
22500 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
22510 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
22520 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
22530 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
22540 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
22550 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
22560 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
22570 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
22580 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
22590 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
225a0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
225b0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
225c0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
225d0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
225e0 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
225f0 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
22600 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
22610 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
22620 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
22630 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
22640 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
22650 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
22660 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
22670 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
22680 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
22690 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
226a0 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
226b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
226c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
226d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
226e0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62  _Integer, 1, iAb
226f0 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
22700 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
22710 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22  "set abort flag"
22720 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
22730 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
22740 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
22750 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73  putRow);.      s
22760 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
22770 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75  eLabel(v, addrOu
22780 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
22790 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
227a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
227b0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
227c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
227d0 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
227e0 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75  iUseFlag, addrOu
227f0 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20  tputRow+2);.    
22800 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22810 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
22820 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
22830 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
22840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22850 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
22860 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
22870 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
22880 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
22890 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
228a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
228b0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
228c0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
228d0 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
228e0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
228f0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
22900 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
22910 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
22920 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22940 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74   distinct, pDest
22950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22960 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
22970 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
22980 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Abort);.      sq
22990 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
229a0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
229b0 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
229c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
229d0 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20  v, "end groupby 
229e0 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
229f0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
22a00 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
22a10 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
22a20 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
22a30 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
22a40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
22a50 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
22a60 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65  abel(v, addrRese
22a70 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  t);.      resetA
22a80 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
22a90 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
22aa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22ab0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
22ac0 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a  urn, regReset);.
22ad0 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
22ae0 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20  ndif pGroupBy.  
22af0 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20  Begin aggregate 
22b00 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20  queries without 
22b10 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20  GROUP BY: */.   
22b20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78   else {.      Ex
22b30 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30  prList *pDel = 0
22b40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
22b50 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
22b60 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
22b70 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ab;.      if( (p
22b80 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f  Tab = isSimpleCo
22b90 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f  unt(p, &sAggInfo
22ba0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
22bb0 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43   /* If isSimpleC
22bc0 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61  ount() returns a
22bd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61   pointer to a Ta
22be0 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74  ble structure, t
22bf0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hen.        ** t
22c00 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
22c10 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
22c20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
22c30 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
22c40 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
22c50 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  bl>.        **. 
22c60 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20         ** where 
22c70 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
22c80 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70  ure returned rep
22c90 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74  resents table <t
22ca0 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  bl>..        **.
22cb0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
22cc0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20  statement is so 
22cd0 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69  common that it i
22ce0 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63  s optimized spec
22cf0 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20  ially. The.     
22d00 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69     ** OP_Count i
22d10 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78  nstruction is ex
22d20 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e  ecuted either on
22d30 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c   the intkey tabl
22d40 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
22d50 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
22d60 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74  ata for table <t
22d70 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66  bl> or on one of
22d80 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74   its indexes. It
22d90 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62  .        ** is b
22da0 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65  etter to execute
22db0 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e   the op on an in
22dc0 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20  dex, as indexes 
22dd0 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20  are almost.     
22de0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72     ** always spr
22df0 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20  ead across less 
22e00 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72  pages than their
22e10 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
22e20 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ables..        *
22e30 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
22e40 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
22e50 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
22e60 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
22e70 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
22e80 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73     const int iCs
22e90 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
22ea0 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ++;     /* Curso
22eb0 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65  r to scan b-tree
22ec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
22ed0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ef0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
22f00 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  iable */.       
22f10 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
22f20 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fo = 0;         
22f30 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f        /* Keyinfo
22f40 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64   for scanned ind
22f50 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ex */.        In
22f60 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20  dex *pBest = 0; 
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78     /* Best index
22f90 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f   found so far */
22fa0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
22fb0 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ot = pTab->tnum;
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22fd0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63   Root page of sc
22fe0 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a  anned b-tree */.
22ff0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23000 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
23010 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
23020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61         sqlite3Ta
23030 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
23040 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
23050 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
23060 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;..        /* Se
23070 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64  arch for the ind
23080 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ex that has the 
23090 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66 20  least amount of 
230a0 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20 20  columns. If.    
230b0 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20      ** there is 
230c0 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c 20 61  such an index, a
230d0 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73 20 63  nd it has less c
230e0 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68 65 20  olumns than the 
230f0 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  table.        **
23100 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65 20 63   does, then we c
23110 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20 69  an assume that i
23120 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73 20  t consumes less 
23130 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20 61 6e  space on disk an
23140 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c  d.        ** wil
23150 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 63  l therefore be c
23160 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e 20 74  heaper to scan t
23170 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
23180 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 20 20  query result..  
23190 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
231a0 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f 74 20   case set iRoot 
231b0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
231c0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
231d0 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20 20 20  ndex b-tree.    
231e0 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79 49      ** and pKeyI
231f0 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79 49 6e  nfo to the KeyIn
23200 66 6f 20 73 74 72 75 63 74 75 72 65 20 72 65 71  fo structure req
23210 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67 61 74  uired to navigat
23220 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  e the.        **
23230 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
23240 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
23250 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
23260 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
23270 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
23280 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
23290 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
232a0 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
232b0 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
232c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f     */.        fo
232d0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
232e0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
232f0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
23300 20 20 20 20 20 20 20 20 69 66 28 20 21 70 42 65          if( !pBe
23310 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c  st || pIdx->nCol
23320 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f 6c 75  umn<pBest->nColu
23330 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
23340 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a    pBest = pIdx;.
23350 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
23370 28 20 70 42 65 73 74 20 26 26 20 70 42 65 73 74  ( pBest && pBest
23380 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e  ->nColumn<pTab->
23390 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
233a0 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d    iRoot = pBest-
233b0 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  >tnum;.         
233c0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
233d0 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
233e0 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a  pParse, pBest);.
233f0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
23400 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61     /* Open a rea
23410 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65  d-only cursor, e
23420 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f  xecute the OP_Co
23430 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63  unt, close the c
23440 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ursor. */.      
23450 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23460 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
23470 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c  ad, iCsr, iRoot,
23480 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69   iDb);.        i
23490 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
234a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
234b0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
234c0 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79  -1, (char *)pKey
234d0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
234e0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
234f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
23500 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23510 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72  , OP_Count, iCsr
23520 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
23530 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  [0].iMem);.     
23540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23550 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
23560 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 7d  , iCsr);.      }
23570 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
23580 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
23590 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b  COUNT */.      {
235a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
235b0 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
235c0 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
235d0 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
235e0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
235f0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
23600 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  min(x) FROM ....
23610 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
23620 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  ECT max(x) FROM 
23630 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ....        **. 
23640 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20         ** If it 
23650 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
23660 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
23670 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
23680 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
23690 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
236a0 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
236b0 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
236c0 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
236d0 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  se. .        ** 
236e0 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
236f0 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
23700 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
23710 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
23720 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20  .        ** add 
23730 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
23740 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
23750 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
23760 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20  ter the .       
23770 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
23780 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
23790 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
237a0 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
237b0 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
237c0 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20  teed to operate 
237d0 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  on the row with 
237e0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d  the minimum or m
237f0 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20  aximum .        
23800 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74  ** value of x, t
23810 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75  he only row requ
23820 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a  ired)..        *
23830 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73  *.        ** A s
23840 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
23850 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
23860 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23870 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
23880 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
23890 62 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c  behaviour as fol
238a0 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  lows:.        **
238b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
238c0 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
238d0 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
238e0 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
238f0 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
23900 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63    **     where.c
23910 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72   should not iter
23920 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c  ate over any val
23930 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ues with a NULL 
23940 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
23950 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20       for x..    
23960 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
23970 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69  *   + The optimi
23980 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72  zer code in wher
23990 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74  e.c (the thing t
239a0 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63  hat decides whic
239b0 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  h.        **    
239c0 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65   index or indice
239d0 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64  s to use) should
239e0 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65   place a differe
239f0 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a  nt priority on .
23a00 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73          **     s
23a10 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
23a20 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
23a30 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
23a40 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
23a50 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65       **     Refe
23a60 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f  r to code and co
23a70 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  mments in where.
23a80 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  c for details.. 
23a90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23aa0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
23ab0 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Max = 0;.       
23ac0 20 75 38 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61   u8 flag = minMa
23ad0 78 51 75 65 72 79 28 70 29 3b 0a 20 20 20 20 20  xQuery(p);.     
23ae0 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20     if( flag ){. 
23af0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
23b00 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23b10 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  y(p->pEList->a[0
23b20 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
23b30 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
23b40 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71      pMinMax = sq
23b50 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
23b60 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  (db, p->pEList->
23b70 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  a[0].pExpr->x.pL
23b80 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ist,0);.        
23b90 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78    pDel = pMinMax
23ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23bb0 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e  pMinMax && !db->
23bc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
23be0 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  Max->a[0].sortOr
23bf0 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52  der = flag!=WHER
23c00 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31  E_ORDERBY_MIN ?1
23c10 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0;.            
23c20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45  pMinMax->a[0].pE
23c30 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
23c40 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UMN;.          }
23c50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
23c60 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
23c70 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
23c80 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
23c90 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
23ca0 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
23cb0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d   processing is m
23cc0 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63  uch simpler sinc
23cd0 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  e there is only 
23ce0 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20  a single row.   
23cf0 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
23d00 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
23d10 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
23d20 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
23d30 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
23d40 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
23d50 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
23d60 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
23d70 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78  pWhere, &pMinMax
23d80 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20 20  , flag);.       
23d90 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
23da0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
23db0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
23dc0 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
23dd0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
23de0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
23df0 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65  }.        update
23e00 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
23e10 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
23e20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4d 69          if( !pMi
23e30 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a  nMax && flag ){.
23e40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23e50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
23e60 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66  P_Goto, 0, pWInf
23e70 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  o->iBreak);.    
23e80 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
23e90 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
23ea0 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20  ndex",.         
23eb0 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48         (flag==WH
23ec0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f  ERE_ORDERBY_MIN?
23ed0 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a  "min":"max")));.
23ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23ef0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
23f00 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
23f10 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
23f20 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
23f30 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
23f40 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64 65    }..      pOrde
23f50 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
23f60 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23f70 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
23f80 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49  g, addrEnd, SQLI
23f90 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
23fa0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
23fb0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
23fc0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
23fd0 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  , 0, -1, .      
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ff0 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
24000 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
24010 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
24020 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
24030 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
24040 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
24050 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
24060 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
24070 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
24080 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  y */..  /* If th
24090 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
240a0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
240b0 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
240c0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
240d0 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
240e0 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
240f0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
24100 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
24110 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
24120 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
24130 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , v, pEList->nEx
24140 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a  pr, pDest);.  }.
24150 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
24160 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65  to skip this que
24170 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
24180 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
24190 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  l(v, iEnd);..  /
241a0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73  * The SELECT was
241b0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
241c0 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72  ded.   Set the r
241d0 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a  eturn code to 0.
241e0 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
241f0 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f   no errors..  */
24200 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  .  rc = 0;..  /*
24210 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
24220 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
24230 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
24240 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
24250 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
24260 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
24270 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
24280 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64  ct_end:..  /* Id
24290 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
242a0 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
242b0 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
242c0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
242d0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
242e0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
242f0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
24300 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
24310 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
24320 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
24330 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
24340 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24350 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
24360 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
24370 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
24380 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e  aFunc);.  return
24390 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69   rc;.}..#if defi
243a0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
243b0 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  )./*.***********
243c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24400 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ****.** The foll
24410 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73  owing code is us
24420 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
24430 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
24440 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20  y.  The code.** 
24450 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65  that follows doe
24460 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
24470 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a  normal builds..*
24480 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
24490 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
244a0 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f  print out the co
244b0 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20  ntent of all or 
244c0 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61  part of a .** pa
244d0 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20 73  rse structures s
244e0 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72  uch as Select or
244f0 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72 69   Expr.  Such pri
24500 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66 75  ntouts are usefu
24510 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67  l.** for helping
24520 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77   to understand w
24530 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67  hat is happening
24540 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65   inside the code
24550 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75   generator.** du
24560 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69  ring the executi
24570 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45  on of complex SE
24580 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
24590 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
245a0 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c  tine are not cal
245b0 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f  led anywhere fro
245c0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72  m within the nor
245d0 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65  mal.** code base
245e0 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65  .  Then are inte
245f0 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  nded to be calle
24600 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  d from within th
24610 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72  e debugger.** or
24620 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20   from temporary 
24630 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65  "printf" stateme
24640 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72  nts inserted for
24650 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76   debugging..*/.v
24660 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
24670 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20  Expr(Expr *p){. 
24680 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
24690 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
246a0 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
246b0 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  oken ){.    sqli
246c0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
246d0 28 25 73 22 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  (%s", p->u.zToke
246e0 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
246f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24700 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70  ntf("(%d", p->op
24710 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
24720 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71 6c  pLeft ){.    sql
24730 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24740 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  " ");.    sqlite
24750 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c  3PrintExpr(p->pL
24760 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eft);.  }.  if( 
24770 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  p->pRight ){.   
24780 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24790 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71  ntf(" ");.    sq
247a0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
247b0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
247c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
247d0 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69 64  ntf(")");.}.void
247e0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
247f0 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
24800 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
24810 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
24820 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
24830 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  {.    sqlite3Pri
24840 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b  ntExpr(pList->a[
24850 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
24860 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  f( i<pList->nExp
24870 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  r-1 ){.      sql
24880 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24890 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", ");.    }.  }
248a0 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
248b0 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65 63  rintSelect(Selec
248c0 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74  t *p, int indent
248d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  ){.  sqlite3Debu
248e0 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c 45  gPrintf("%*sSELE
248f0 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e 74  CT(%p) ", indent
24900 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c 69  , "", p);.  sqli
24910 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
24920 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73  (p->pEList);.  s
24930 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24940 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70  f("\n");.  if( p
24950 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63 68  ->pSrc ){.    ch
24960 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20 20  ar *zPrefix;.   
24970 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72 65   int i;.    zPre
24980 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20 20  fix = "FROM";.  
24990 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
249a0 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
249b0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
249c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
249d0 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61  em = &p->pSrc->a
249e0 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [i];.      sqlit
249f0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
24a00 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c 20  *s ", indent+6, 
24a10 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20  zPrefix);.      
24a20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20  zPrefix = "";.  
24a30 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
24a40 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
24a50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24a60 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20 20  intf("(\n");.   
24a70 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e       sqlite3Prin
24a80 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e 70  tSelect(pItem->p
24a90 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b 31  Select, indent+1
24aa0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
24ab0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24ac0 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38 2c  %*s)", indent+8,
24ad0 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   "");.      }els
24ae0 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  e if( pItem->zNa
24af0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
24b00 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24b10 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ("%s", pItem->zN
24b20 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
24b30 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
24b40 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
24b50 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24b60 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22 2c  f("(table: %s)",
24b70 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
24b80 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
24b90 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
24ba0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
24bb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24bc0 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70 49  ntf(" AS %s", pI
24bd0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
24be0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24bf0 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d  i<p->pSrc->nSrc-
24c00 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
24c10 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24c20 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ",");.      }.  
24c30 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24c40 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
24c50 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
24c60 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73  >pWhere ){.    s
24c70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24c80 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c 20  f("%*s WHERE ", 
24c90 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
24ca0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
24cb0 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  r(p->pWhere);.  
24cc0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24cd0 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
24ce0 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
24cf0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
24d00 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
24d10 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e 64   GROUP BY ", ind
24d20 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
24d30 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
24d40 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  st(p->pGroupBy);
24d50 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24d60 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
24d70 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76   }.  if( p->pHav
24d80 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ing ){.    sqlit
24d90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
24da0 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e 64  *s HAVING ", ind
24db0 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
24dc0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
24dd0 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
24de0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24df0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
24e00 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
24e10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
24e20 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 4f  bugPrintf("%*s O
24e30 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65 6e  RDER BY ", inden
24e40 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
24e50 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
24e60 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  (p->pOrderBy);. 
24e70 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24e80 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
24e90 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  .}./* End of the
24ea0 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67   structure debug
24eb0 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a   printing code.*
24ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
24f10 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
24f20 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
24f30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
24f40 45 42 55 47 29 20 2a 2f 0a                       EBUG) */.