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

Artifact 32d0f4e5513362706b8973e7f1b87cd0885dfbf5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  iParm = iParm;. 
04a0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
04b0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
04c0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  Mem = 0;.  pDest
04d0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a  ->nMem = 0;.}...
04e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
04f0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0500: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0510: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0520: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0530: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0540: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0560: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0570: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0580: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0590: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
05a0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
05b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
05c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
05d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
05e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
05f0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0600: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0610: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0620: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0630: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0640: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0650: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0660: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0670: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0680: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0690: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
06a0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
06b0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
06c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
06d0: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
06e0: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
06f0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0700: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
0870: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
0880: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
0890: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08a0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08b0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08d0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
08e0: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
08f0: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0900: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0910: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65   = pEList;.  pNe
0920: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
0930: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
0940: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
0950: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0960: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
0970: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
0980: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
0990: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
09a0: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
09b0: 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46   isDistinct ? SF
09c0: 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20  _Distinct : 0;. 
09d0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
09e0: 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70  ELECT;.  pNew->p
09f0: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
0a00: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
0a10: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73  = pOffset;.  ass
0a20: 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20  ert( pOffset==0 
0a30: 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  || pLimit!=0 );.
0a40: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a50: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
0a60: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a70: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
0a80: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a90: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
0aa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0ab0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
0ac0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lect(db, pNew);.
0ad0: 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73      if( pNew!=&s
0ae0: 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33  tandin ) sqlite3
0af0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
0b00: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
0b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0b20: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  w;.}../*.** Dele
0b30: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
0b40: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
0b50: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
0b60: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
0b70: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0b80: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
0b90: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
0ba0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0bb0: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
0bc0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
0bd0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
0be0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
0bf0: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
0c00: 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74  ers preceeding t
0c10: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
0c20: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
0c30: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
0c40: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
0c50: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
0c60: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
0c70: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
0c80: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0c90: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
0ca0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
0cb0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53  .**     JT_CROSS
0cc0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
0cd0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
0ce0: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
0cf0: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
0d00: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
0d10: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
0d20: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
0d30: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
0d40: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
0d50: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
0d60: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
0d70: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
0d80: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
0d90: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
0da0: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
0db0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
0dc0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
0dd0: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50  qlite3JoinType(P
0de0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0df0: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0e00: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0e10: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0e20: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0e30: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0e40: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p;.             
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20  /*   0123456789 
0e70: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
0e80: 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61  789 123 */.  sta
0e90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
0ea0: 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74  KeyText[] = "nat
0eb0: 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74  uraleftouteright
0ec0: 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b  fullinnercross";
0ed0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0ee0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20  struct {.    u8 
0ef0: 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  i;        /* Beg
0f00: 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72  inning of keywor
0f10: 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65  d text in zKeyTe
0f20: 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e  xt[] */.    u8 n
0f30: 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67  Char;    /* Leng
0f40: 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72  th of the keywor
0f50: 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20  d in characters 
0f60: 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20  */.    u8 code; 
0f70: 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65      /* Join type
0f80: 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65   mask */.  } aKe
0f90: 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  yword[] = {.    
0fa0: 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20  /* natural */ { 
0fb0: 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41  0,  7, JT_NATURA
0fc0: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L               
0fd0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20   },.    /* left 
0fe0: 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a     */ { 6,  4, J
0ff0: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
1000: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1010: 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20  /* outer   */ { 
1020: 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  10, 5, JT_OUTER 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74   },.    /* right
1050: 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a     */ { 14, 5, J
1060: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
1070: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1080: 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20  /* full    */ { 
1090: 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a  19, 4, JT_LEFT|J
10a0: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
10b0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72   },.    /* inner
10c0: 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a     */ { 23, 5, J
10d0: 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20  T_INNER         
10e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
10f0: 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20  /* cross   */ { 
1100: 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c  28, 5, JT_INNER|
1110: 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20  JT_CROSS        
1120: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
1130: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
1140: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
1150: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
1160: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
1170: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1180: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1190: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
11a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79  for(j=0; j<Array
11b0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20  Size(aKeyword); 
11c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
11d0: 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a  p->n==aKeyword[j
11e0: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
11f0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
1200: 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e  NICmp((char*)p->
1210: 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65  z, &zKeyText[aKe
1220: 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e  yword[j].i], p->
1230: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
1240: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65   jointype |= aKe
1250: 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20  yword[j].code;. 
1260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1280: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c  testcase( j==0 |
1290: 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c  | j==1 || j==2 |
12a0: 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c  | j==3 || j==4 |
12b0: 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29  | j==5 || j==6 )
12c0: 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72  ;.    if( j>=Arr
12d0: 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29  aySize(aKeyword)
12e0: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
12f0: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
1300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1310: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
1320: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
1330: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1340: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
1350: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
1360: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
1370: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
1380: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1390: 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73  p = " ";.    ass
13a0: 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20  ert( pB!=0 );.  
13b0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
13c0: 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  Sp++; }.    sqli
13d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13e0: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
13f0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1400: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
1410: 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c  "%T %T%s%T", pA,
1420: 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20   pB, zSp, pC);. 
1430: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1440: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
1450: 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20  if( (jointype & 
1460: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
1470: 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74         && (joint
1480: 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1490: 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45  T_RIGHT))!=JT_LE
14a0: 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  FT ){.    sqlite
14b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14c0: 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20  , .      "RIGHT 
14d0: 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a  and FULL OUTER J
14e0: 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72  OINs are not cur
14f0: 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64  rently supported
1500: 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  ");.    jointype
1510: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1520: 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79  .  return jointy
1530: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  pe;.}../*.** Ret
1540: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1550: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74   a column in a t
1560: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  able.  Return -1
1570: 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a   if the column.*
1580: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
1590: 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ed in the table.
15a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
15b0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65  olumnIndex(Table
15c0: 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68   *pTab, const ch
15d0: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74  ar *zCol){.  int
15e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
15f0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
1600: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1610: 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  e3StrICmp(pTab->
1620: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[i].zName, z
1630: 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Col)==0 ) return
1640: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1650: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   -1;.}../*.** Se
1660: 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e  arch the first N
1670: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c   tables in pSrc,
1680: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
1690: 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ght, looking for
16a0: 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74   a.** table that
16b0: 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61   has a column na
16c0: 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a  med zCol.  .**.*
16d0: 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65  * When found, se
16e0: 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69  t *piTab and *pi
16f0: 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65  Col to the table
1700: 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d   index and colum
1710: 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68  n index.** of th
1720: 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  e matching colum
1730: 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55  n and return TRU
1740: 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20  E..**.** If not 
1750: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41  found, return FA
1760: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
1770: 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  nt tableAndColum
1780: 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73  nIndex(.  SrcLis
1790: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f  t *pSrc,       /
17a0: 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65  * Array of table
17b0: 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  s to search */. 
17c0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
17d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17e0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  of tables in pSr
17f0: 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68  c->a[] to search
1800: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1810: 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61   *zCol,    /* Na
1820: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1830: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
1840: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  for */.  int *pi
1850: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
1860: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
1870: 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a  pSrc->a[] here *
1880: 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20  /.  int *piCol  
1890: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
18a0: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
18b0: 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d  >a[*piTab].pTab-
18c0: 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a  >aCol[] here */.
18d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
18e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
18f0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
1900: 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a  bles in pSrc */.
1910: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
1920: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1930: 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69  of column matchi
1940: 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73  ng zCol */..  as
1950: 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29  sert( (piTab==0)
1960: 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20  ==(piCol==0) ); 
1970: 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74   /* Both or neit
1980: 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a  her are NULL */.
1990: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
19a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  i++){.    iCol =
19b0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72   columnIndex(pSr
19c0: 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43  c->a[i].pTab, zC
19d0: 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  ol);.    if( iCo
19e0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l>=0 ){.      if
19f0: 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20  ( piTab ){.     
1a00: 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20     *piTab = i;. 
1a10: 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20         *piCol = 
1a20: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iCol;.      }.  
1a30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1a60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1a70: 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20  ed to add terms 
1a80: 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20  implied by JOIN 
1a90: 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a  syntax to the.**
1aa0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
1ab0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45  pression of a SE
1ac0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1ad0: 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68  The new term, wh
1ae0: 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20  ich.** is ANDed 
1af0: 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e  with the existin
1b00: 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  g WHERE clause, 
1b10: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
1b20: 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63  **.**    (tab1.c
1b30: 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29  ol1 = tab2.col2)
1b40: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
1b50: 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68  1 is the iSrc'th
1b60: 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73   table in SrcLis
1b70: 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20  t pSrc and tab2 
1b80: 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63  is the .** (iSrc
1b90: 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63  +1)'th. Column c
1ba0: 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  ol1 is column iC
1bb0: 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20  olLeft of tab1, 
1bc0: 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63  and col2 is.** c
1bd0: 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20  olumn iColRight 
1be0: 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74  of tab2..*/.stat
1bf0: 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65  ic void addWhere
1c00: 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1c10: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1c20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1c30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
1c70: 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  s in FROM clause
1c80: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c   */.  int iLeft,
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1cb0: 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f  f first table to
1cc0: 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f   join in pSrc */
1cd0: 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c  .  int iColLeft,
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
1d00: 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74  olumn in first t
1d10: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1d20: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
1d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d40: 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62  ex of second tab
1d50: 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  le in pSrc */.  
1d60: 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20  int iColRight,  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
1d90: 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62  mn in second tab
1da0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75  le */.  int isOu
1db0: 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20  terJoin,        
1dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1dd0: 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55  if this is an OU
1de0: 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78  TER join */.  Ex
1df0: 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20  pr **ppWhere    
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45   IN/OUT: The WHE
1e20: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64  RE clause to add
1e30: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69   to */.){.  sqli
1e40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1e50: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
1e60: 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a  1;.  Expr *pE2;.
1e70: 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20    Expr *pEq;..  
1e80: 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52  assert( iLeft<iR
1e90: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1ea0: 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69  ( pSrc->nSrc>iRi
1eb0: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
1ec0: 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e   pSrc->a[iLeft].
1ed0: 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74  pTab );.  assert
1ee0: 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74  ( pSrc->a[iRight
1ef0: 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31  ].pTab );..  pE1
1f00: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1f10: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
1f20: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c  Src, iLeft, iCol
1f30: 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73  Left);.  pE2 = s
1f40: 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75  qlite3CreateColu
1f50: 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c  mnExpr(db, pSrc,
1f60: 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67   iRight, iColRig
1f70: 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71  ht);..  pEq = sq
1f80: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1f90: 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70  e, TK_EQ, pE1, p
1fa0: 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45  E2, 0);.  if( pE
1fb0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
1fc0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
1fd0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
1fe0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
1ff0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
2000: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  nyProperty(pEq, 
2010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2020: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2030: 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
2040: 6c 65 28 70 45 71 29 3b 0a 20 20 20 20 70 45 71  le(pEq);.    pEq
2050: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2060: 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54  e = (i16)pE2->iT
2070: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57  able;.  }.  *ppW
2080: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
2090: 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65  prAnd(db, *ppWhe
20a0: 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a  re, pEq);.}../*.
20b0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
20c0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
20d0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
20e0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
20f0: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
2100: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
2110: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
2120: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
2130: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
2140: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
2150: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2160: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
2170: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
2180: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
2190: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
21a0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
21b0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
21c0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
21d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
21e0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
21f0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
2200: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
2210: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
2220: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
2230: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
2240: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
2250: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
2260: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
2270: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
2280: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
2290: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
22a0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
22b0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
22c0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22d0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
22e0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
22f0: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
2300: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
2310: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
2320: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2330: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
2340: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
2350: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
2360: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
2370: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
2380: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
2390: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
23a0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
23b0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
23c0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
23d0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23e0: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
23f0: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
2400: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
2410: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
2420: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
2430: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2440: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
2450: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
2460: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
2470: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
2480: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
2490: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
24a0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
24b0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
24c0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
24d0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
24e0: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
24f0: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
2500: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
2510: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
2520: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
2530: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
2540: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
2550: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
2560: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
2570: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
2580: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
2590: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
25a0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
25b0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
25c0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
25d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
25e0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
25f0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
2600: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2610: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
2620: 75 63 69 62 6c 65 28 70 29 3b 0a 20 20 20 20 70  ucible(p);.    p
2630: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2640: 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b  e = (i16)iTable;
2650: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
2660: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
2670: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
2680: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
2690: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26a0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
26b0: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
26c0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
26d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
26e0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
26f0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
2700: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
2710: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2720: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
2730: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
2740: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
2750: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
2760: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
2770: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
2780: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2790: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
27a0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
27b0: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
27c0: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
27d0: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
27e0: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
27f0: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
2800: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
2810: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
2820: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
2830: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
2840: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
2850: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
2860: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
2870: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
2880: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
2890: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
28a0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
28b0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
28c0: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
28d0: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
28e0: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
28f0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2900: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2910: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2920: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
2930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
2940: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
2950: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2960: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
2970: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2990: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
29a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
29b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29e0: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
29f0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
2a00: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
2a10: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2a20: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
2a30: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
2a40: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
2a50: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
2a60: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
2a70: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
2a80: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
2a90: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
2aa0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
2ab0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
2ac0: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
2ad0: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
2ae0: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
2af0: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
2b00: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
2b10: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
2b20: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
2b30: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
2b40: 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20  VER(pLeftTab==0 
2b50: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
2b60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b70: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
2b80: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2b90: 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20  T_OUTER)!=0;..  
2ba0: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
2bb0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
2bc0: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
2bd0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2be0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
2bf0: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
2c00: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
2c10: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
2c20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2c30: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2c40: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
2c50: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2c60: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
2c70: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
2c80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2c90: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
2ca0: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
2cb0: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
2cc0: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
2cd0: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
2ce0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2d00: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
2d10: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2d20: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2d30: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
2d40: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
2d50: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
2d60: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
2d70: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
2d80: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
2d90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
2da0: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
2db0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
2dc0: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
2dd0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
2de0: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
2df0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2e00: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
2e10: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
2e20: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
2e30: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
2e40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
2e50: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
2e60: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2e70: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
2e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e90: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
2ea0: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
2eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ec0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
2ed0: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
2ee0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2ef0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
2f00: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
2f10: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
2f20: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
2f30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2f40: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2f50: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2f60: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2f70: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2f80: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2f90: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2fa0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2fb0: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2fc0: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2fd0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2fe0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2ff0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3000: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3010: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3020: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3030: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3040: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3050: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3060: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3070: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3080: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3090: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
30a0: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
30b0: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
30c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
30d0: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
30e0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
30f0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3100: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3110: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3120: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3130: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3140: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3150: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3160: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3170: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3180: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3190: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
31a0: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
31b0: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
31c0: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
31d0: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
31e0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
31f0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3200: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3210: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3220: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3230: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3240: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3250: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3260: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3270: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3280: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3290: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
32a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
32b0: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
32c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
32d0: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
32e0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
32f0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3300: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3310: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3320: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3330: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3340: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3350: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3360: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3370: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3380: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3390: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
33a0: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
33b0: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
33c0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
33d0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
33e0: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
33f0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3400: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3410: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3420: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3430: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3440: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3450: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3460: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3470: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3480: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3490: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
34a0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
34b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
34c0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
34d0: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
34e0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
34f0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3500: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3510: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3520: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3530: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
3540: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
3550: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3560: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3570: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
3580: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
3590: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
35a0: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
35b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
35d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
35e0: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
35f0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
3600: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
3610: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
3620: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
3630: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
3640: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
3650: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3660: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
3670: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3680: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
3690: 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  erBy,    /* The 
36a0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
36b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
36c0: 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  lect,       /* T
36d0: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
36e0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
36f0: 6e 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20  nt regData      
3700: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
3710: 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74  r holding data t
3720: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29  o be sorted */.)
3730: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
3740: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
3750: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65  nt nExpr = pOrde
3760: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e  rBy->nExpr;.  in
3770: 74 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69  t regBase = sqli
3780: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
3790: 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29  pParse, nExpr+2)
37a0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  ;.  int regRecor
37b0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
37c0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
37d0: 20 69 6e 74 20 6f 70 3b 0a 20 20 73 71 6c 69 74   int op;.  sqlit
37e0: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
37f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
3800: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
3810: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
3820: 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30  erBy, regBase, 0
3830: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3840: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
3850: 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d  uence, pOrderBy-
3860: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61  >iECursor, regBa
3870: 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c  se+nExpr);.  sql
3880: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
3890: 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61  (pParse, regData
38a0: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
38b0: 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  1, 1);.  sqlite3
38c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
38d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
38e0: 42 61 73 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c  Base, nExpr + 2,
38f0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69   regRecord);.  i
3900: 66 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  f( pSelect->selF
3910: 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72  lags & SF_UseSor
3920: 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ter ){.    op = 
3930: 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b  OP_SorterInsert;
3940: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
3950: 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b   = OP_IdxInsert;
3960: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
3970: 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
3980: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
3990: 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  or, regRecord);.
39a0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
39b0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
39c0: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
39d0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
39e0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
39f0: 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b  gBase, nExpr+2);
3a00: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
3a10: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
3a20: 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
3a30: 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a      int iLimit;.
3a40: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d      if( pSelect-
3a50: 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >iOffset ){.    
3a60: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
3a70: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20  ct->iOffset+1;. 
3a80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3a90: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
3aa0: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a  ->iLimit;.    }.
3ab0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
3ac0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3ad0: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d   OP_IfZero, iLim
3ae0: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
3af0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3b00: 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c  _AddImm, iLimit,
3b10: 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20   -1);.    addr2 
3b20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3b30: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
3b40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3b50: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
3b60: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
3b70: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3b80: 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  Last, pOrderBy->
3b90: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
3ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3bb0: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
3bc0: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
3bd0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
3be0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
3bf0: 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ddr2);.  }.}../*
3c00: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20  .** Add code to 
3c10: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46  implement the OF
3c20: 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76  FSET.*/.static v
3c30: 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a  oid codeOffset(.
3c40: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3c50: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
3c60: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
3c70: 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  M */.  Select *p
3c80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3c90: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3ca0: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
3cb0: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20    int iContinue 
3cc0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
3cd0: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
3ce0: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29  rent record */.)
3cf0: 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73  {.  if( p->iOffs
3d00: 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21  et && iContinue!
3d10: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
3d20: 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dr;.    sqlite3V
3d30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3d40: 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73  AddImm, p->iOffs
3d50: 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64  et, -1);.    add
3d60: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
3d70: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65  ddOp1(v, OP_IfNe
3d80: 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  g, p->iOffset);.
3d90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3da0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
3db0: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
3dc0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
3dd0: 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45  ((v, "skip OFFSE
3de0: 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  T records"));.  
3df0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
3e00: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
3e10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
3e20: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
3e30: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
3e40: 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65  re the N registe
3e50: 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69  rs starting at i
3e60: 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69  Mem.** form a di
3e70: 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69  stinct entry.  i
3e80: 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67  Tab is a sorting
3e90: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
3ea0: 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
3eb0: 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  seen combination
3ec0: 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65  s of the N value
3ed0: 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  s.  A new entry 
3ee0: 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a  is made in iTab.
3ef0: 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ** if the curren
3f00: 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e  t N values are n
3f10: 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  ew..**.** A jump
3f20: 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69   to addrRepeat i
3f30: 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e  s made and the N
3f40: 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  +1 values are po
3f50: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  pped from the.**
3f60: 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f   stack if the to
3f70: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  p N elements are
3f80: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a   not distinct..*
3f90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
3fa0: 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61  deDistinct(.  Pa
3fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3fc0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
3fd0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
3fe0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
3ff0: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
4000: 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64  /* A sorting ind
4010: 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  ex used to test 
4020: 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73  for distinctness
4030: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65   */.  int addrRe
4040: 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70  peat,    /* Jump
4050: 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20   to here if not 
4060: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
4070: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
4080: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
4090: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
40a0: 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f  iMem           /
40b0: 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  * First element 
40c0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  */.){.  Vdbe *v;
40d0: 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20  .  int r1;..  v 
40e0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
40f0: 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
4100: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
4110: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4120: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
4130: 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64  Found, iTab, add
4140: 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e  rRepeat, iMem, N
4150: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4160: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
4170: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
4180: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
4190: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
41a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62  _IdxInsert, iTab
41b0: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
41c0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
41d0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
41e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
41f0: 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
4200: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72  * Generate an er
4210: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
4220: 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65   a SELECT is use
4230: 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78  d within a subex
4240: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61  pression.** (exa
4250: 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45  mple:  "a IN (SE
4260: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c  LECT * FROM tabl
4270: 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20  e)") but it has 
4280: 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75  more than 1 resu
4290: 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57  lt.** column.  W
42a0: 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73  e do this in a s
42b0: 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73  ubroutine becaus
42c0: 65 20 74 68 65 20 65 72 72 6f 72 20 75 73 65 64  e the error used
42d0: 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20   to occur.** in 
42e0: 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e  multiple places.
42f0: 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c    (The error onl
4300: 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20  y occurs in one 
4310: 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77  place now, but w
4320: 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20  e.** retain the 
4330: 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69  subroutine to mi
4340: 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72  nimize code disr
4350: 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74  uption.).*/.stat
4360: 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d  ic int checkForM
4370: 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
4380: 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a  Error(.  Parse *
4390: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
43a0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20   Parse context. 
43b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
43c0: 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73  *pDest,   /* Des
43d0: 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45  tination of SELE
43e0: 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  CT results */.  
43f0: 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20  int nExpr       
4400: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4410: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
4420: 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
4430: 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ECT */.){.  int 
4440: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
4450: 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70  Dest;.  if( nExp
4460: 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53  r>1 && (eDest==S
4470: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
4480: 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20  =SRT_Set) ){.   
4490: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
44a0: 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61  (pParse, "only a
44b0: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
44c0: 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
44d0: 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
44e0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
44f0: 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
4500: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
4510: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
4520: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
4530: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4540: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
4550: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
4560: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
4570: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
4580: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
4590: 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f  f srcTab and nCo
45a0: 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65  lumn are both ze
45b0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c  ro, then the pEL
45c0: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
45d0: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
45e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
45f0: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
4600: 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c  is row.  If nCol
4610: 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61  umn>0.** then da
4620: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
4630: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
4640: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
4650: 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64   to get the.** d
4660: 61 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63  atatypes for eac
4670: 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  h column..*/.sta
4680: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49  tic void selectI
4690: 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73  nnerLoop(.  Pars
46a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
46b0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
46c0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
46d0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
46e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
46f0: 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74  mplete select st
4700: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
4710: 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ded */.  ExprLis
4720: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
4730: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
4740: 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74  es being extract
4750: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
4760: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
4770: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
4780: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  m this table */.
4790: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
47a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
47b0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
47c0: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  n the source tab
47d0: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
47e0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
47f0: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
4800: 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69  sort results usi
4810: 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  ng this key */. 
4820: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20   int distinct,  
4830: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
4840: 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  =0, make sure re
4850: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e  sults are distin
4860: 63 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ct */.  SelectDe
4870: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
4880: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
4890: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
48a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
48b0: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
48c0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
48d0: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
48e0: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
48f0: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
4900: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4910: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
4920: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
4930: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
4940: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
4950: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
4960: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
4970: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
4980: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
4990: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
49a0: 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b    int regResult;
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
49c0: 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79   Start of memory
49d0: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
49e0: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  set */.  int eDe
49f0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
4a00: 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64  t;   /* How to d
4a10: 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74  ispose of result
4a20: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  s */.  int iParm
4a30: 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b   = pDest->iParm;
4a40: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
4a50: 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c  ment to disposal
4a60: 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74   method */.  int
4a70: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20   nResultCol;    
4a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4a90: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
4aa0: 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  umns */..  asser
4ab0: 74 28 20 76 20 29 3b 0a 20 20 69 66 28 20 4e 45  t( v );.  if( NE
4ac0: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
4ad0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  rn;.  assert( pE
4ae0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73  List!=0 );.  has
4af0: 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69  Distinct = disti
4b00: 6e 63 74 3e 3d 30 3b 0a 20 20 69 66 28 20 70 4f  nct>=0;.  if( pO
4b10: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61  rderBy==0 && !ha
4b20: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
4b30: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
4b40: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
4b50: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
4b60: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
4b70: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ns..  */.  if( n
4b80: 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20  Column>0 ){.    
4b90: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f  nResultCol = nCo
4ba0: 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lumn;.  }else{. 
4bb0: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4bc0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
4bd0: 20 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e   }.  if( pDest->
4be0: 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70  iMem==0 ){.    p
4bf0: 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  Dest->iMem = pPa
4c00: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
4c10: 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e   pDest->nMem = n
4c20: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70  ResultCol;.    p
4c30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
4c40: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
4c50: 73 65 7b 20 0a 20 20 20 20 61 73 73 65 72 74 28  se{ .    assert(
4c60: 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 3d 3d 6e 52   pDest->nMem==nR
4c70: 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 7d 0a  esultCol );.  }.
4c80: 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44    regResult = pD
4c90: 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28  est->iMem;.  if(
4ca0: 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20   nColumn>0 ){.  
4cb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
4cc0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
4cd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4ce0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
4cf0: 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67  , srcTab, i, reg
4d00: 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d  Result+i);.    }
4d10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
4d20: 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
4d30: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
4d40: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
4d50: 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78  n EXISTS(...) ex
4d60: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63  pression, the ac
4d70: 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tual.    ** valu
4d80: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  es returned by t
4d90: 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f  he SELECT are no
4da0: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
4db0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
4dc0: 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
4dd0: 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rse);.    sqlite
4de0: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
4df0: 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
4e00: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 65 44 65  , regResult, eDe
4e10: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b  st==SRT_Output);
4e20: 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d  .  }.  nColumn =
4e30: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
4e40: 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e  /* If the DISTIN
4e50: 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70  CT keyword was p
4e60: 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45  resent on the SE
4e70: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
4e80: 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77   ** and this row
4e90: 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62   has been seen b
4ea0: 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e  efore, then do n
4eb0: 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77  ot make this row
4ec0: 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  .  ** part of th
4ed0: 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20  e result..  */. 
4ee0: 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74   if( hasDistinct
4ef0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4f00: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
4f10: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d   assert( pEList-
4f20: 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20  >nExpr==nColumn 
4f30: 29 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69  );.    codeDisti
4f40: 6e 63 74 28 70 50 61 72 73 65 2c 20 64 69 73 74  nct(pParse, dist
4f50: 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  inct, iContinue,
4f60: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73   nColumn, regRes
4f70: 75 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  ult);.    if( pO
4f80: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
4f90: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
4fa0: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   p, iContinue);.
4fb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
4fc0: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
4fd0: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
4fe0: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
4ff0: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
5000: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
5010: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
5020: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
5030: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
5040: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
5050: 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53  ELECT.    case S
5060: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
5070: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
5080: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
5090: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
50a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
50b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
50c0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
50d0: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
50e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
50f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5100: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
5110: 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  m, r1);.      sq
5120: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5130: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5140: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5150: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
5160: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
5170: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
5180: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
5190: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
51a0: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
51b0: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
51c0: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
51d0: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
51e0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
51f0: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
5200: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
5210: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  cept: {.      sq
5220: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5230: 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c  v, OP_IdxDelete,
5240: 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c   iParm, regResul
5250: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
5260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5270: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53  #endif..    /* S
5280: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
5290: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
52a0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
52b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
52c0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
52d0: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
52e0: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
52f0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5300: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
5310: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
5320: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
5330: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
5340: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
5350: 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
5360: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5370: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
5380: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5390: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66  n, r1);.      if
53a0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
53b0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
53c0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
53d0: 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20  derBy, p, r1);. 
53e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
53f0: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
5400: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5410: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5430: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
5440: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
5450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5460: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
5470: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
5480: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
5490: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
54a0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
54b0: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
54c0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
54d0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
54e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
54f0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5500: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5510: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5520: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
5530: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
5540: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
5550: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
5560: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
5570: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
5580: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
5590: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
55a0: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
55b0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
55c0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
55d0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
55e0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
55f0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
5600: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5610: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
5620: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
5630: 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  =1 );.      p->a
5640: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
5650: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
5660: 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  (pEList->a[0].pE
5670: 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 69  xpr, pDest->affi
5680: 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 69 66 28  nity);.      if(
5690: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
56a0: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
56b0: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
56c0: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
56d0: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
56e0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
56f0: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
5700: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
5710: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
5720: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
5730: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
5740: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
5750: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
5760: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
5770: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
5780: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
5790: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
57a0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
57b0: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
57c0: 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  By, p, regResult
57d0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
57e0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
57f0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5800: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5820: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
5830: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
5840: 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61 66  t, 1, r1, &p->af
5850: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
5860: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
5870: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
5880: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
5890: 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  sult, 1);.      
58a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
58b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
58c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
58d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
58e0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
58f0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5900: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5910: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
5920: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
5930: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
5940: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
5950: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
5960: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5970: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
5980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5990: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
59a0: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
59b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
59c0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
59d0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
59e0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
59f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
5a00: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
5a10: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
5a20: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
5a30: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
5a40: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
5a50: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
5a60: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
5a70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
5a80: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
5a90: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
5aa0: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
5ab0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
5ac0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
5ad0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
5ae0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
5af0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5b00: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
5b10: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67  pOrderBy, p, reg
5b20: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
5b30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5b40: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
5b50: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
5b60: 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ult, iParm, 1);.
5b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
5b80: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
5b90: 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
5ba0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
5bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5bc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5bd0: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
5be0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
5bf0: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e  Y */..    /* Sen
5c00: 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  d the data to th
5c10: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
5c20: 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72  ion or to a subr
5c30: 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a  outine.  In the.
5c40: 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61      ** case of a
5c50: 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65   subroutine, the
5c60: 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65   subroutine itse
5c70: 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  lf is responsibl
5c80: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70  e for.    ** pop
5c90: 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72  ping the data fr
5ca0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  om the stack..  
5cb0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5cc0: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20  T_Coroutine:.   
5cd0: 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74   case SRT_Output
5ce0: 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
5cf0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
5d00: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
5d10: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
5d20: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
5d30: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
5d40: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rBy ){.        i
5d50: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
5d60: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5d70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5d80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5d90: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
5da0: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5db0: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  n, r1);.        
5dc0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
5dd0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
5de0: 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   p, r1);.       
5df0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5e00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5e10: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  1);.      }else 
5e20: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
5e30: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
5e40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5e50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
5e60: 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29  d, pDest->iParm)
5e70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5e80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5e90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
5ea0: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
5eb0: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  ult, nColumn);. 
5ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5ed0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
5ee0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
5ef0: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5f00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5f20: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
5f30: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
5f40: 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
5f50: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
5f60: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  is is used for S
5f70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
5f80: 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74   inside.    ** t
5f90: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  he body of a TRI
5fa0: 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f  GGER.  The purpo
5fb0: 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63  se of such selec
5fc0: 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20  ts is to call.  
5fd0: 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65    ** user-define
5fe0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  d functions that
5ff0: 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63   have side effec
6000: 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63  ts.  We do not c
6010: 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74  are.    ** about
6020: 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
6030: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
6040: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
6050: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
6060: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
6070: 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20  T_Discard );.   
6080: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6090: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
60a0: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
60b0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
60c0: 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
60d0: 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69  ched.  Except, i
60e0: 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  f.  ** there is 
60f0: 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69  a sorter, in whi
6100: 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74  ch case the sort
6110: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c  er has already l
6120: 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  imited.  ** the 
6130: 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20  output for us.. 
6140: 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
6150: 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  By==0 && p->iLim
6160: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
6170: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6180: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
6190: 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29  mit, iBreak, -1)
61a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
61b0: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
61c0: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
61d0: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
61e0: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
61f0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
6200: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
6210: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
6220: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
6230: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
6240: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
6250: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
6260: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
6270: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
6280: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
6290: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
62a0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
62b0: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
62c0: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
62d0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
62e0: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
62f0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
6300: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
6310: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
6320: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
6330: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
6340: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
6350: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
6360: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
6370: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
6380: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
6390: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
63a0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
63b0: 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61  s obtain from ma
63c0: 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69  lloc.  The calli
63d0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
63e0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
63f0: 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68  r seeing that th
6400: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
6410: 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
6420: 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b 65  eed.  Add the Ke
6430: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
6440: 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c 64 20  to the P4 field 
6450: 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73 69  of an opcode usi
6460: 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46 4f  ng.** P4_KEYINFO
6470: 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65 20  _HANDOFF is the 
6480: 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65 61  usual way of dea
6490: 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e 0a  ling with this..
64a0: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
64b0: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
64c0: 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50  prList(Parse *pP
64d0: 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  arse, ExprList *
64e0: 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pList){.  sqlite
64f0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6500: 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b  db;.  int nExpr;
6510: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66  .  KeyInfo *pInf
6520: 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  o;.  struct Expr
6530: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
6540: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
6550: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
6560: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
6570: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
6580: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  o(db, sizeof(*pI
6590: 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73 69  nfo) + nExpr*(si
65a0: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
65b0: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  ) );.  if( pInfo
65c0: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61   ){.    pInfo->a
65d0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
65e0: 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  )&pInfo->aColl[n
65f0: 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f  Expr];.    pInfo
6600: 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
6610: 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f  nExpr;.    pInfo
6620: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
6630: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64 62 20 3d  .    pInfo->db =
6640: 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   db;.    for(i=0
6650: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
6660: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  ; i<nExpr; i++, 
6670: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
6680: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
6690: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
66a0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
66b0: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
66c0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
66d0: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
66e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
66f0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
6700: 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   }.      pInfo->
6710: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
6720: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
6730: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
6740: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
6750: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6760: 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69  urn pInfo;.}..#i
6770: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6780: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
6790: 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  T./*.** Name of 
67a0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
67b0: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
67c0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
67d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
67e0: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
67f0: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
6800: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
6810: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
6820: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
6830: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
6840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
6850: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
6860: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
6870: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
6880: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
6890: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
68a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
68b0: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
68c0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
68d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
68e0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
68f0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6900: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
6910: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
6920: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
6930: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  LAIN./*.** Unles
6940: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
6950: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
6960: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
6970: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
6980: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
6990: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
69a0: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
69b0: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
69c0: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
69d0: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
69e0: 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  tion is of the f
69f0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53  orm:.**.**   "US
6a00: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
6a10: 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65  R xxx".**.** whe
6a20: 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66  re xxx is one of
6a30: 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52   "DISTINCT", "OR
6a40: 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55  DER BY" or "GROU
6a50: 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77  P BY". Exactly w
6a60: 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72  hich.** is deter
6a70: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73  mined by the zUs
6a80: 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  age argument..*/
6a90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
6aa0: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61  lainTempTable(Pa
6ab0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
6ac0: 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29  st char *zUsage)
6ad0: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
6ae0: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
6af0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
6b00: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
6b10: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
6b20: 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
6b30: 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50  e->db, "USE TEMP
6b40: 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c   B-TREE FOR %s",
6b50: 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71   zUsage);.    sq
6b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
6b70: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
6b80: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
6b90: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
6ba0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
6bb0: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65  ../*.** Assign e
6bc0: 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c  xpression b to l
6bd0: 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e  value a. A secon
6be0: 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f  d, no-op, versio
6bf0: 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a  n of this macro.
6c00: 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77  ** is provided w
6c10: 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  hen SQLITE_OMIT_
6c20: 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e  EXPLAIN is defin
6c30: 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ed. This allows 
6c40: 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73  the code.** in s
6c50: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74  qlite3Select() t
6c60: 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20  o assign values 
6c70: 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d  to structure mem
6c80: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  ber variables th
6c90: 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74  at.** only exist
6ca0: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
6cb0: 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64  EXPLAIN is not d
6cc0: 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70  efined without p
6cd0: 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20  olluting the.** 
6ce0: 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65  code with #ifnde
6cf0: 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f  f directives..*/
6d00: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
6d10: 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62  nSetInteger(a, b
6d20: 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f  ) a = b..#else./
6d30: 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73  * No-op versions
6d40: 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58   of the explainX
6d50: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  XX() functions a
6d60: 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20  nd macros. */.# 
6d70: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65  define explainTe
6d80: 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64  mpTable(y,z).# d
6d90: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
6da0: 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e  Integer(y,z).#en
6db0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
6dc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
6dd0: 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e  PLAIN) && !defin
6de0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
6df0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a  OMPOUND_SELECT).
6e00: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
6e10: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
6e20: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
6e30: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
6e40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
6e50: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
6e60: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
6e70: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
6e80: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
6e90: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
6ea0: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
6eb0: 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
6ec0: 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a   two forms:.**.*
6ed0: 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53  *   "COMPOSITE S
6ee0: 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20  UBQUERIES iSub1 
6ef0: 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a  and iSub2 (op)".
6f00: 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20  **   "COMPOSITE 
6f10: 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31  SUBQUERIES iSub1
6f20: 20 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47   and iSub2 USING
6f30: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70   TEMP B-TREE (op
6f40: 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69  )".**.** where i
6f50: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 61  Sub1 and iSub2 a
6f60: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20  re the integers 
6f70: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f  passed as the co
6f80: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66  rresponding.** f
6f90: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
6fa0: 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68  rs, and op is th
6fb0: 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74  e text represent
6fc0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
6fd0: 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
6fe0: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20   same name. The 
6ff0: 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d  parameter "op" m
7000: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b  ust be one of TK
7010: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
7020: 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45  T,.** TK_INTERSE
7030: 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68  CT or TK_ALL. Th
7040: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20  e first form is 
7050: 75 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74  used if argument
7060: 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20   bUseTmp is .** 
7070: 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65  false, or the se
7080: 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20  cond form if it 
7090: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
70a0: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43  ic void explainC
70b0: 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73  omposite(.  Pars
70c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
70e0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
70f0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55    /* One of TK_U
7120: 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20  NION, TK_EXCEPT 
7130: 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  etc. */.  int iS
7140: 75 62 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ub1,            
7150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
7160: 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20  query id 1 */.  
7170: 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20 20  int iSub2,      
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 32  /* Subquery id 2
71a0: 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d   */.  int bUseTm
71b0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
71c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
71d0: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61   a temp table wa
71e0: 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  s used */.){.  a
71f0: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e  ssert( op==TK_UN
7200: 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58  ION || op==TK_EX
7210: 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
7220: 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d  NTERSECT || op==
7230: 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20  TK_ALL );.  if( 
7240: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
7250: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
7260: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
7270: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
7280: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
7290: 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  tf(.        pPar
72a0: 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e  se->db, "COMPOUN
72b0: 44 20 53 55 42 51 55 45 52 49 45 53 20 25 64 20  D SUBQUERIES %d 
72c0: 41 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c 20  AND %d %s(%s)", 
72d0: 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20  iSub1, iSub2,.  
72e0: 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55        bUseTmp?"U
72f0: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
7300: 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e   ":"", selectOpN
7310: 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20  ame(op).    );. 
7320: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7330: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
7340: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
7350: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
7360: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
7370: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e    }.}.#else./* N
7380: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
7390: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
73a0: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
73b0: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
73c0: 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ine explainCompo
73d0: 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a  site(v,w,x,y,z).
73e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
73f0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
7400: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
7410: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
7420: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
7430: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
7440: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
7450: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
7460: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
7470: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
7480: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
7490: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
74a0: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
74b0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
74c0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
74d0: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
74e0: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
74f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7500: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
7510: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
7520: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
7530: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
7540: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
7550: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
7560: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
7570: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
7580: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
7590: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
75a0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
75b0: 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ,      /* Number
75c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   of columns of d
75d0: 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
75e0: 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72  est *pDest /* Wr
75f0: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
7600: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
7610: 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65 61  {.  int addrBrea
7620: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
7630: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20  akeLabel(v);    
7640: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
7650: 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20   exit loop */.  
7660: 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  int addrContinue
7670: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
7680: 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
7690: 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65  Jump here for ne
76a0: 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
76b0: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54  t addr;.  int iT
76c0: 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f  ab;.  int pseudo
76d0: 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c  Tab = 0;.  ExprL
76e0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
76f0: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
7700: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
7710: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
7720: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
7730: 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67  Parm;..  int reg
7740: 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Row;.  int regRo
7750: 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70  wid;..  iTab = p
7760: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
7770: 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73 71  r;.  regRow = sq
7780: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
7790: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 65  pParse);.  if( e
77a0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
77b0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
77c0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
77d0: 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72  pseudoTab = pPar
77e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
77f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7800: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
7810: 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 72  do, pseudoTab, r
7820: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
7830: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
7840: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
7850: 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  regRowid = sqlit
7860: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7870: 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rse);.  }.  if( 
7880: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
7890: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
78a0: 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74    int regSortOut
78b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
78c0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
78d0: 20 20 69 6e 74 20 70 74 61 62 32 20 3d 20 70 50    int ptab2 = pP
78e0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
78f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7900: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
7910: 65 75 64 6f 2c 20 70 74 61 62 32 2c 20 72 65 67  eudo, ptab2, reg
7920: 53 6f 72 74 4f 75 74 2c 20 70 4f 72 64 65 72 42  SortOut, pOrderB
7930: 79 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20  y->nExpr+2);.   
7940: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
7950: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7960: 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
7970: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
7980: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
7990: 28 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74 69  (v, p, addrConti
79a0: 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nue);.    sqlite
79b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
79c0: 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54  P_SorterData, iT
79d0: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 29 3b  ab, regSortOut);
79e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
79f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
7a00: 75 6d 6e 2c 20 70 74 61 62 32 2c 20 70 4f 72 64  umn, ptab2, pOrd
7a10: 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
7a20: 65 67 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69  egRow);.    sqli
7a30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7a40: 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43  v, OPFLAG_CLEARC
7a50: 41 43 48 45 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ACHE);.  }else{.
7a60: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
7a70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7a80: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
7a90: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
7aa0: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
7ab0: 20 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65   p, addrContinue
7ac0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7ad0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
7ae0: 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72  olumn, iTab, pOr
7af0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20  derBy->nExpr+1, 
7b00: 72 65 67 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 73  regRow);.  }.  s
7b10: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
7b20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
7b30: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
7b40: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
7b50: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7b60: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
7b70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7b80: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
7b90: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
7ba0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7bb0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
7bc0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
7bd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7be0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7bf0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
7c00: 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29  egRow, regRowid)
7c10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7c20: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
7c30: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
7c40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7c50: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
7c60: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
7c70: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
7c80: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
7c90: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
7ca0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7cb0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
7cc0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
7cd0: 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 20 26 70   1, regRowid, &p
7ce0: 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a  ->affinity, 1);.
7cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7d00: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
7d10: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
7d20: 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  Row, 1);.      s
7d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7d40: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
7d50: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
7d60: 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
7d70: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7d80: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
7d90: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
7da0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
7db0: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
7dc0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
7dd0: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
7de0: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
7df0: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
7e00: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
7e10: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
7e20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7e30: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
7e40: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
7e50: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
7e60: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
7e70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
7e80: 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20  utine ); .      
7e90: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7ea0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
7eb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
7ec0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
7ed0: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ine );.      for
7ee0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
7ef0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
7f00: 73 73 65 72 74 28 20 72 65 67 52 6f 77 21 3d 70  ssert( regRow!=p
7f10: 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20 29 3b 0a  Dest->iMem+i );.
7f20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7f30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7f40: 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61  Column, pseudoTa
7f50: 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69 4d 65  b, i, pDest->iMe
7f60: 6d 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  m+i);.        if
7f70: 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
7f80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7f90: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
7fa0: 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20  G_CLEARCACHE);. 
7fb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7fc0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
7fd0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
7fe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7ff0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8000: 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74  ResultRow, pDest
8010: 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29  ->iMem, nColumn)
8020: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8030: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
8040: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
8050: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43   pDest->iMem, nC
8060: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65  olumn);.      }e
8070: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
8090: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
80a0: 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t->iParm);.     
80b0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
80c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
80d0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
80e0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
80f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
8100: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
8110: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20  e, regRowid);.. 
8120: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
8130: 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  f the loop.  */.
8140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
8150: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
8160: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66  rContinue);.  if
8170: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
8180: 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  SF_UseSorter ){.
8190: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
81a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
81b0: 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  erNext, iTab, ad
81c0: 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
81d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
81e0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
81f0: 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d  iTab, addr);.  }
8200: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
8210: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
8220: 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
8230: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
8240: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
8250: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
8260: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8270: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
8280: 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20  pseudoTab, 0);. 
8290: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
82a0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
82b0: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
82c0: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
82d0: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
82e0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
82f0: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
8300: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
8310: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
8320: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
8330: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
8340: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
8350: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
8360: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
8370: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67  from the.** orig
8380: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
8390: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
83a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
83b0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a   a column. The.*
83c0: 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  * declaration ty
83d0: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
83e0: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
83f0: 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e   Exactly when an
8400: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
8410: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  s considered a c
8420: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d  olumn can be com
8430: 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73  plex in the pres
8440: 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69  ence of subqueri
8450: 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c  es. The.** resul
8460: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
8470: 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   in all of the f
8480: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
8490: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a  statements is .*
84a0: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  * considered a c
84b0: 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75  olumn by this fu
84c0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
84d0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
84e0: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
84f0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
8500: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
8510: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
8520: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53  ROM tbl);.**   S
8530: 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28  ELECT abc FROM (
8540: 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62  SELECT col AS ab
8550: 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  c FROM tbl);.** 
8560: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
8570: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79  ion type for any
8580: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65   expression othe
8590: 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20  r than a column 
85a0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  is NULL..*/.stat
85b0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
85c0: 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d  olumnType(.  Nam
85d0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
85e0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
85f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
8600: 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73  OriginDb,.  cons
8610: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
8620: 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  nTab,.  const ch
8630: 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c  ar **pzOriginCol
8640: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
8650: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 63   *zType = 0;.  c
8660: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
8670: 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  inDb = 0;.  char
8680: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54   const *zOriginT
8690: 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ab = 0;.  char c
86a0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c  onst *zOriginCol
86b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
86c0: 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
86d0: 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72  ==0) || pNC->pSr
86e0: 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  cList==0 ) retur
86f0: 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  n 0;..  switch( 
8700: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
8710: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
8720: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
8730: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
8740: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
8750: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
8760: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
8770: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62   the column is b
8780: 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78  eing.      ** ex
8790: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20  tracted from in 
87a0: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
87b0: 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65  List. This table
87c0: 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20   may be real.   
87d0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
87e0: 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65  able or a subque
87f0: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
8800: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
8810: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
8820: 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
8830: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
8840: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
8850: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
8860: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8870: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f  /* Select the co
8880: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
8890: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
88a0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
88b0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49  ->iColumn;  /* I
88c0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
88d0: 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20  n pTab */.      
88e0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
88f0: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
8900: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
8910: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
8920: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
8930: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
8940: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
8950: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
8960: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
8970: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
8980: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
8990: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
89a0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
89b0: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
89c0: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
89d0: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
89e0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
89f0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
8a00: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
8a10: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
8a20: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
8a30: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
8a40: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
8a50: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
8a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8a70: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
8a80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
8a90: 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f   At one time, co
8aa0: 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45  de such as "SELE
8ab0: 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e  CT new.x" within
8ac0: 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64   a trigger would
8ad0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73  .        ** caus
8ae0: 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  e this condition
8af0: 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20   to run.  Since 
8b00: 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65  then, we have re
8b10: 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20  structured how. 
8b20: 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65         ** trigge
8b30: 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  r code is genera
8b40: 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ted and so this 
8b50: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20  condition is no 
8b60: 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20  longer .        
8b70: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77  ** possible. How
8b80: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69  ever, it can sti
8b90: 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73  ll be true for s
8ba0: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20  tatements like. 
8bb0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f         ** the fo
8bc0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20  llowing:.       
8bd0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
8be0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
8bf0: 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20  (col INTEGER);. 
8c00: 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
8c10: 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  CT (SELECT t1.co
8c20: 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b  l) FROM FROM t1;
8c30: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
8c40: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75      ** when colu
8c50: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
8c60: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
8c70: 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e  sion "t1.col" in
8c80: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
8c90: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20   sub-select. In 
8ca0: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74  this case, set t
8cb0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74  he column type t
8cc0: 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20  o NULL, even.   
8cd0: 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69       ** though i
8ce0: 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20  t should really 
8cf0: 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20  be "INTEGER"..  
8d00: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
8d10: 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
8d20: 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68  a problem, as th
8d30: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66  e column type of
8d40: 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76   "t1.col" is nev
8d50: 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  er.        ** us
8d60: 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54  ed. When columnT
8d70: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
8d80: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
8d90: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28  n .        ** "(
8da0: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c  SELECT t1.col)",
8db0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
8dc0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73  e is returned (s
8dd0: 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54  ee the TK_SELECT
8de0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e  .        ** bran
8df0: 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ch below.  */.  
8e00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e10: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
8e20: 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70  rt( pTab && pExp
8e30: 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  r->pTab==pTab );
8e40: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
8e50: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
8e60: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
8e70: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
8e80: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
8e90: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
8ea0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
8eb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8ec0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
8ed0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
8ee0: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
8ef0: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
8f00: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
8f10: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
8f20: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
8f30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
8f40: 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69  l>=0 && ALWAYS(i
8f50: 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  Col<pS->pEList->
8f60: 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
8f70: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
8f80: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
8f90: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
8fa0: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
8fb0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
8fc0: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
8fd0: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
8fe0: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
8ff0: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
9000: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
9010: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
9020: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
9030: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
9040: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
9050: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
9060: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
9070: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
9080: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
9090: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
90a0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
90b0: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
90c0: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
90d0: 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pNC;.          
90e0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
90f0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
9100: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
9110: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
9120: 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72  &zOriginDb, &zOr
9130: 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69  iginTab, &zOrigi
9140: 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20  nCol); .        
9150: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
9160: 28 20 41 4c 57 41 59 53 28 70 54 61 62 2d 3e 70  ( ALWAYS(pTab->p
9170: 53 63 68 65 6d 61 29 20 29 7b 0a 20 20 20 20 20  Schema) ){.     
9180: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
9190: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  le */.        as
91a0: 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20  sert( !pS );.   
91b0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
91c0: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
91d0: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73  PKey;.        as
91e0: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
91f0: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
9200: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
9210: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
9220: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
9230: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
9240: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
9250: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77  OriginCol = "row
9260: 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id";.        }el
9270: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
9280: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
9290: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
92a0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43          zOriginC
92b0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
92c0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
92d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
92e0: 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62  OriginTab = pTab
92f0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
9300: 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65   if( pNC->pParse
9310: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
9320: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
9330: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
9340: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
9350: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
9360: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44          zOriginD
9370: 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  b = pNC->pParse-
9380: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
9390: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
93a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
93b0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
93c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
93d0: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
93e0: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
93f0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
9400: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
9410: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
9420: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
9430: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
9440: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
9450: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
9460: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
9470: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
9480: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
9490: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
94a0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
94b0: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
94c0: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78  t *pS = pExpr->x
94d0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
94e0: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
94f0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
9500: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9510: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9520: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
9530: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
9540: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
9550: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
9560: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
9570: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
9580: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
9590: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
95a0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
95b0: 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72  &zOriginDb, &zOr
95c0: 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69  iginTab, &zOrigi
95d0: 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72  nCol); .      br
95e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
95f0: 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70  f.  }.  .  if( p
9600: 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20  zOriginDb ){.   
9610: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69   assert( pzOrigi
9620: 6e 54 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e  nTab && pzOrigin
9630: 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72  Col );.    *pzOr
9640: 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e  iginDb = zOrigin
9650: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69  Db;.    *pzOrigi
9660: 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61  nTab = zOriginTa
9670: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  b;.    *pzOrigin
9680: 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c  Col = zOriginCol
9690: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
96a0: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
96b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
96c0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
96d0: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
96e0: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
96f0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
9700: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
9710: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
9720: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
9730: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9740: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
9750: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
9760: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
9770: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
9780: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
9790: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
97a0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
97b0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
97c0: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
97d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
97e0: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
97f0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9800: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
9810: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
9820: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
9830: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
9840: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
9850: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
9860: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
9870: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
9880: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
9890: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
98a0: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
98b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
98c0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
98d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
98e0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
98f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
9900: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
9910: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
9920: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
9930: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
9940: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
9950: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
9960: 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  rigCol);..    /*
9970: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
9980: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
9990: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
99a0: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
99b0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
99c0: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
99d0: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
99e0: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
99f0: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
9a00: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
9a10: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
9a20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9a30: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
9a40: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
9a50: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
9a60: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
9a70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9a80: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
9a90: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
9aa0: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
9ab0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
9ac0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
9ad0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
9ae0: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
9af0: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
9b00: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
9b10: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
9b20: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
9b30: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
9b40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9b50: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
9b60: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
9b70: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
9b80: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
9b90: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9ba0: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f  OMIT_DECLTYPE */
9bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
9bc0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
9bd0: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
9be0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
9bf0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
9c00: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
9c10: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
9c20: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
9c30: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
9c40: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
9c50: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
9c60: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
9c70: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
9c80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9c90: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
9ca0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
9cb0: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
9cc0: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
9cd0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9ce0: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
9cf0: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
9d00: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
9d10: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
9d20: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
9d30: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
9d40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9d50: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
9d60: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
9d70: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
9d80: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
9d90: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
9da0: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
9db0: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
9dc0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
9dd0: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
9de0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
9df0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
9e00: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56  lNamesSet || NEV
9e10: 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e  ER(v==0) || db->
9e20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
9e30: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
9e40: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
9e50: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
9e60: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
9e70: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
9e80: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
9e90: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
9ea0: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
9eb0: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
9ec0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
9ed0: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
9ee0: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
9ef0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
9f00: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
9f10: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
9f20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
9f30: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
9f40: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
9f50: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
9f60: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
9f70: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
9f80: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
9f90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
9fa0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
9fb0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
9fc0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
9fd0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
9fe0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9ff0: 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  (p->op==TK_COLUM
a000: 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  N || p->op==TK_A
a010: 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54  GG_COLUMN) && pT
a020: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
a030: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
a040: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
a050: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
a060: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
a070: 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59    for(j=0; ALWAY
a080: 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  S(j<pTabList->nS
a090: 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rc); j++){.     
a0a0: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
a0b0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70  >a[j].iCursor==p
a0c0: 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b  ->iTable ) break
a0d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a0e0: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
a0f0: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
a100: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
a110: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
a120: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
a130: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
a140: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
a150: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
a160: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
a170: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
a180: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
a190: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
a1a0: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
a1b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a1c0: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
a1d0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
a1e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a1f0: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
a200: 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  !fullNames ){.  
a210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a220: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
a230: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
a240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a250: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
a260: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
a270: 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  pan), SQLITE_DYN
a280: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
a290: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
a2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
a2b0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
a2c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
a2d0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
a2e0: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
a2f0: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
a300: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a310: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
a320: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
a330: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
a340: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
a350: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a360: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
a370: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
a380: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
a390: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
a3a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
a3b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a3c0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
a3d0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
a3e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
a3f0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
a400: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
a410: 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  pan), SQLITE_DYN
a420: 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
a430: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
a440: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
a450: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
a460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
a470: 20 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   a an expression
a480: 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20   list (which is 
a490: 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20  really the list 
a4a0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  of expressions.*
a4b0: 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  * that form the 
a4c0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
a4d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a4e0: 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70  ) compute approp
a4f0: 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  riate.** column 
a500: 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c  names for a tabl
a510: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c  e that would hol
a520: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
a530: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   list..**.** All
a540: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69   column names wi
a550: 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a  ll be unique..**
a560: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c  .** Only the col
a570: 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f  umn names are co
a580: 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e  mputed.  Column.
a590: 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43  zType, Column.zC
a5a0: 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  oll,.** and othe
a5b0: 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75  r fields of Colu
a5c0: 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  mn are zeroed..*
a5d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
a5e0: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
a5f0: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
a600: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
a610: 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65  occurs,.** store
a620: 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20   NULL in *paCol 
a630: 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20  and 0 in *pnCol 
a640: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
a650: 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74  E_NOMEM..*/.stat
a660: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c  ic int selectCol
a670: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
a680: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a690: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
a6a0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a6b0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
a6c0: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
a6d0: 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
a6e0: 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
a6f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
a700: 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  int *pnCol,     
a710: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
a720: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
a730: 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
a740: 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
a750: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
a760: 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
a770: 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
a780: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a790: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
a7a0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
a7b0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
a7c0: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
a7d0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
a7e0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
a7f0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
a800: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
a810: 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
a820: 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
a830: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
a840: 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
a850: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
a860: 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
a870: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
a880: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a890: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a8a0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
a8b0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
a8c0: 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20   Expr *p;       
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a8e0: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61  Expression for a
a8f0: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63   single result c
a900: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
a910: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
a920: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
a930: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
a940: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
a950: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
a960: 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b  f name in zName[
a970: 5d 20 2a 2f 0a 0a 20 20 2a 70 6e 43 6f 6c 20 3d  ] */..  *pnCol =
a980: 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   nCol = pEList->
a990: 6e 45 78 70 72 3b 0a 20 20 61 43 6f 6c 20 3d 20  nExpr;.  aCol = 
a9a0: 2a 70 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  *paCol = sqlite3
a9b0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
a9c0: 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29   sizeof(aCol[0])
a9d0: 2a 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 61 43  *nCol);.  if( aC
a9e0: 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ol==0 ) return S
a9f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 66  QLITE_NOMEM;.  f
aa00: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
aa10: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
aa20: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  pCol++){.    /* 
aa30: 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  Get an appropria
aa40: 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  te name for the 
aa50: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20  column.    */.  
aa60: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
aa70: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  i].pExpr;.    as
aa80: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
aa90: 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
aaa0: 70 65 72 74 79 28 70 2d 3e 70 52 69 67 68 74 2c  perty(p->pRight,
aab0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 0a 20 20   EP_IntValue).  
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
aad0: 70 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f  p->pRight->u.zTo
aae0: 6b 65 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ken==0 || p->pRi
aaf0: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  ght->u.zToken[0]
ab00: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
ab10: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
ab20: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
ab30: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
ab40: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
ab50: 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
ab60: 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
ab70: 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
ab80: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
ab90: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
aba0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
abb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
abc0: 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70  pr *pColExpr = p
abd0: 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73  ;  /* The expres
abe0: 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65  sion that is the
abf0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
ac00: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62  ame */.      Tab
ac10: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
ac20: 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63    /* Table assoc
ac30: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
ac40: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
ac50: 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45      while( pColE
ac60: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  xpr->op==TK_DOT 
ac70: 29 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f  ) pColExpr = pCo
ac80: 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
ac90: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70       if( pColExp
aca0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
acb0: 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45   && ALWAYS(pColE
acc0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b  xpr->pTab!=0) ){
acd0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
ace0: 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
acf0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
ad00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
ad10: 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
ad20: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
ad30: 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70    pTab = pColExp
ad40: 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
ad50: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
ad60: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
ad70: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
ad80: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
ad90: 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20  (db, "%s",.     
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c              iCol
adb0: 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c  >=0 ? pTab->aCol
adc0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22  [iCol].zName : "
add0: 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d  rowid");.      }
ade0: 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70  else if( pColExp
adf0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  r->op==TK_ID ){.
ae00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ae10: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
ae20: 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e  (pColExpr, EP_In
ae30: 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
ae40: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
ae50: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
ae60: 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e  s", pColExpr->u.
ae70: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
ae80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
ae90: 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
aea0: 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
aeb0: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
aec0: 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
aed0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
aee0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
aef0: 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e  , "%s", pEList->
af00: 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
af10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
af20: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
af30: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  led ){.      sql
af40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
af50: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
af60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
af70: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
af80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
af90: 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e  nique.  If the n
afa0: 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  ame is not uniqu
afb0: 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64  e,.    ** append
afc0: 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68   a integer to th
afd0: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
afe0: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
aff0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61  ..    */.    nNa
b000: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
b010: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  en30(zName);.   
b020: 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c   for(j=cnt=0; j<
b030: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  i; j++){.      i
b040: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
b050: 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  p(aCol[j].zName,
b060: 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20   zName)==0 ){.  
b070: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
b080: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e  Name;.        zN
b090: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
b0a0: 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65          zNewName
b0b0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
b0c0: 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a  f(db, "%s:%d", z
b0d0: 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20  Name, ++cnt);.  
b0e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
b0f0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
b100: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b110: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
b120: 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    j = -1;.      
b130: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
b140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b150: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
b160: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
b170: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c   }.  if( db->mal
b180: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b190: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a   for(j=0; j<i; j
b1a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
b1b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
b1c0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
b1d0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
b1e0: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a  Free(db, aCol);.
b1f0: 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a      *paCol = 0;.
b200: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a      *pnCol = 0;.
b210: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b220: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
b230: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79  .}../*.** Add ty
b250: 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
b260: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
b270: 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61  a column list ba
b280: 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45  sed on.** a SELE
b290: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
b2a0: 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20   .** The column 
b2b0: 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20  list presumably 
b2c0: 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74  came from select
b2d0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45  ColumnNamesFromE
b2e0: 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68  xprList()..** Th
b2f0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61  e column list ha
b300: 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f  s only names, no
b310: 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61  t types or colla
b320: 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20  tions.  This.** 
b330: 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72  routine goes thr
b340: 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68  ough and adds th
b350: 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
b360: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
b370: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69  is routine requi
b380: 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65  res that all ide
b390: 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20  ntifiers in the 
b3a0: 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
b3b0: 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e  ent be resolved.
b3c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b3d0: 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
b3e0: 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
b3f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b400: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
b410: 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ing contexts */.
b420: 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20    int nCol,     
b430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b440: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  r of columns */.
b450: 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20    Column *aCol, 
b460: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
b470: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
b480: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
b490: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
b4a0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
b4b0: 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
b4c0: 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73  ations */.){.  s
b4d0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b4e0: 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43  rse->db;.  NameC
b4f0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f  ontext sNC;.  Co
b500: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f  lumn *pCol;.  Co
b510: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
b520: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70  int i;.  Expr *p
b530: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
b540: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20  ist_item *a;..  
b550: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21  assert( pSelect!
b560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b570: 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61  (pSelect->selFla
b580: 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
b590: 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
b5a0: 28 20 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ( nCol==pSelect-
b5b0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
b5c0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
b5d0: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
b5e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
b5f0: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
b600: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
b610: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
b620: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
b630: 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
b640: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
b650: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
b660: 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  =aCol; i<nCol; i
b670: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
b680: 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b   p = a[i].pExpr;
b690: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  .    pCol->zType
b6a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b6b0: 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70  up(db, columnTyp
b6c0: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
b6d0: 20 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e   0));.    pCol->
b6e0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
b6f0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
b700: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d  );.    if( pCol-
b710: 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70  >affinity==0 ) p
b720: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
b730: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
b740: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
b750: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
b760: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
b770: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
b780: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
b790: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b7a0: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
b7b0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
b7c0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
b7d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
b7e0: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
b7f0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
b800: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
b810: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
b820: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
b830: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65  Table *sqlite3Re
b840: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
b850: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
b860: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
b870: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
b880: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b890: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
b8a0: 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20  t savedFlags;.. 
b8b0: 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62   savedFlags = db
b8c0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66  ->flags;.  db->f
b8d0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
b8e0: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  FullColNames;.  
b8f0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
b900: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
b910: 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  s;.  sqlite3Sele
b920: 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
b930: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
b940: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
b950: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
b960: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
b970: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
b980: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
b990: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73  .  db->flags = s
b9a0: 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61  avedFlags;.  pTa
b9b0: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
b9c0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
b9d0: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
b9e0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
b9f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ba00: 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33    /* The sqlite3
ba10: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
ba20: 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  t() is only used
ba30: 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72   n contexts wher
ba40: 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a  e lookaside.  **
ba50: 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
ba60: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
ba70: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
ba80: 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e  ==0 );.  pTab->n
ba90: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
baa0: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54  >zName = 0;.  pT
bab0: 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30  ab->nRowEst = 10
bac0: 30 30 30 30 30 3b 0a 20 20 73 65 6c 65 63 74 43  00000;.  selectC
bad0: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
bae0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
baf0: 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  ct->pEList, &pTa
bb00: 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
bb10: 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41  aCol);.  selectA
bb20: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
bb30: 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
bb40: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
bb50: 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 65 63 74  b->aCol, pSelect
bb60: 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  );.  pTab->iPKey
bb70: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d   = -1;.  if( db-
bb80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
bb90: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
bba0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
bbb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
bbc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
bbd0: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ab;.}../*.** Get
bbe0: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
bbf0: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
bc00: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
bc10: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
bc20: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
bc30: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
bc40: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
bc50: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
bc60: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
bc70: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
bc80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
bc90: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
bca0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
bcb0: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
bcc0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
bcd0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
bce0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
bcf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bd00: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66  MIT_TRACE.    if
bd10: 28 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ( v ){.      sql
bd20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
bd30: 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20 20  , OP_Trace);.   
bd40: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
bd50: 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a  return v;.}.../*
bd60: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
bd70: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
bd80: 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
bd90: 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
bda0: 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61   the.** pLimit a
bdb0: 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65  nd pOffset expre
bdc0: 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20  ssions.  pLimit 
bdd0: 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64  and pOffset hold
bde0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
bdf0: 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
be00: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
be10: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
be20: 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
be30: 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
be40: 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69  ords.  Or NULL i
be50: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
be60: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c   are omitted. iL
be70: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
be80: 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74   .** are the int
be90: 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
bea0: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
beb0: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
bec0: 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68  o compute .** th
bed0: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
bee0: 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  et.  If there is
bef0: 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72   no limit and/or
bf00: 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a   offset, then .*
bf10: 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
bf20: 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
bf30: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
bf40: 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
bf50: 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d  e values of iLim
bf60: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
bf70: 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
bf80: 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
bf90: 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74  efined by pLimit
bfa0: 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69   and pOffset.  i
bfb0: 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
bfc0: 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
bfd0: 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
bfe0: 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
bff0: 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75  ult values.** (u
c000: 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61  sually but not a
c010: 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20  lways -1) prior 
c020: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
c030: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79  routine..** Only
c040: 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72   if pLimit!=0 or
c050: 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74   pOffset!=0 do t
c060: 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
c070: 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
c080: 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
c090: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
c0a0: 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
c0b0: 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
c0c0: 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
c0d0: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
c0e0: 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
c0f0: 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
c100: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c110: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
c120: 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
c130: 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
c140: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
c150: 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
c160: 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
c170: 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
c180: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
c190: 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20   int addr1, n;. 
c1a0: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
c1b0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a   return;..  /* .
c1c0: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
c1d0: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
c1e0: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
c1f0: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
c200: 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  aversy about wha
c210: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
c220: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
c230: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
c240: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
c250: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
c260: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
c270: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
c280: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
c290: 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
c2a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
c2b0: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d  pOffset==0 || p-
c2c0: 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >pLimit!=0 );.  
c2d0: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
c2e0: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
c2f0: 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
c300: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
c310: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c320: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
c330: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
c340: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 56 44 42 45  return;  /* VDBE
c350: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
c360: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
c370: 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ted */.    if( s
c380: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
c390: 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26  ger(p->pLimit, &
c3a0: 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
c3b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c3c0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
c3d0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
c3e0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
c3f0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
c400: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
c410: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c420: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c430: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72   OP_Goto, 0, iBr
c440: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
c450: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e{.        if( p
c460: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28  ->nSelectRow > (
c470: 64 6f 75 62 6c 65 29 6e 20 29 20 70 2d 3e 6e 53  double)n ) p->nS
c480: 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75 62  electRow = (doub
c490: 6c 65 29 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  le)n;.      }.  
c4a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
c4b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c4c0: 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
c4d0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
c4e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c4f0: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
c500: 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  nt, iLimit);.   
c510: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c520: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
c530: 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
c540: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c550: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d   OP_IfZero, iLim
c560: 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  it, iBreak);.   
c570: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f   }.    if( p->pO
c580: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70  ffset ){.      p
c590: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
c5a0: 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
c5b0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72  nMem;.      pPar
c5c0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a  se->nMem++;   /*
c5d0: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74   Allocate an ext
c5e0: 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ra register for 
c5f0: 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a  limit+offset */.
c600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c610: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
c620: 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65  >pOffset, iOffse
c630: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c640: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c650: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
c660: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  fset);.      Vdb
c670: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
c680: 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  FSET counter"));
c690: 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
c6a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c6b0: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
c6c0: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
c6d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c6e0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
c6f0: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
c700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c710: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
c720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c730: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
c740: 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66  dd, iLimit, iOff
c750: 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b  set, iOffset+1);
c760: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
c770: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46  nt((v, "LIMIT+OF
c780: 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61  FSET"));.      a
c790: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
c7a0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
c7b0: 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  fPos, iLimit);. 
c7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c7d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
c7e0: 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65  eger, -1, iOffse
c7f0: 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t+1);.      sqli
c800: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c810: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d  v, addr1);.    }
c820: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
c830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
c840: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
c850: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
c860: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
c870: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
c880: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
c890: 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
c8a0: 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
c8b0: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
c8c0: 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
c8d0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
c8e0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
c8f0: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
c900: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
c910: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
c920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
c930: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
c940: 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
c950: 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
c960: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
c970: 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
c980: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
c990: 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
c9a0: 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
c9b0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
c9c0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
c9d0: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
c9e0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
c9f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
ca00: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
ca10: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
ca20: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
ca30: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
ca40: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
ca50: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
ca60: 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69  ( iCol>=0 );.  i
ca70: 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43  f( pRet==0 && iC
ca80: 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ol<p->pEList->nE
ca90: 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  xpr ){.    pRet 
caa0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
cab0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
cac0: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
cad0: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
cae0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e  turn pRet;.}.#en
caf0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cb00: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
cb10: 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  CT */../* Forwar
cb20: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
cb30: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
cb40: 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
cb50: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
cb60: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
cb70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
cb80: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
cb90: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
cba0: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
cbb0: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
cbc0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
cbd0: 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
cbe0: 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
cbf0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a   results */.);..
cc00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cc10: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
cc20: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LECT./*.** This 
cc30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
cc40: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63  d to process a c
cc50: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f  ompound query fo
cc60: 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f  rm from.** two o
cc70: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
cc80: 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e  queries using UN
cc90: 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  ION, UNION ALL, 
cca0: 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e  EXCEPT, or.** IN
ccb0: 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70  TERSECT.**.** "p
ccc0: 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  " points to the 
ccd0: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68  right-most of th
cce0: 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20  e two queries.  
ccf0: 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65  the query on the
cd00: 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70  .** left is p->p
cd10: 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74  Prior.  The left
cd20: 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73   query could als
cd30: 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  o be a compound 
cd40: 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63  query.** in whic
cd50: 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  h case this rout
cd60: 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
cd70: 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
cd80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
cd90: 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  ts of the total 
cda0: 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20  query are to be 
cdb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64  written into a d
cdc0: 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  estination.** of
cdd0: 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68   type eDest with
cde0: 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d   parameter iParm
cdf0: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
ce00: 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74  1:  Consider a t
ce10: 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e  hree-way compoun
ce20: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
ce30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
ce40: 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T a FROM t1 UNIO
ce50: 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
ce60: 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
ce70: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20  c FROM t3.**.** 
ce80: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
ce90: 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66  s parsed up as f
cea0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
ceb0: 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20    SELECT c FROM 
cec0: 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20  t3.**      |.** 
ced0: 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45       `----->  SE
cee0: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a  LECT b FROM t2.*
cef0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
cf00: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
cf10: 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53       `------>  S
cf20: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a  ELECT a FROM t1.
cf30: 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73  **.** The arrows
cf40: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20   in the diagram 
cf50: 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20  above represent 
cf60: 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f  the Select.pPrio
cf70: 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f  r pointer..** So
cf80: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
cf90: 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
cfa0: 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  p equal to the t
cfb0: 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  3 query, then.**
cfc0: 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20   pPrior will be 
cfd0: 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70  the t2 query.  p
cfe0: 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f  ->op will be TK_
cff0: 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61  UNION in this ca
d000: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65  se..**.** Notice
d010: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66   that because of
d020: 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20   the way SQLite 
d030: 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20  parses compound 
d040: 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20  SELECTs, the.** 
d050: 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
d060: 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20  ts always group 
d070: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
d080: 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ht..*/.static in
d090: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20  t multiSelect(. 
d0a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d0b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
d0c0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
d0d0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
d0e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
d0f0: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
d100: 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
d110: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
d120: 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
d130: 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
d140: 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
d150: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d160: 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65  E_OK;   /* Succe
d170: 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
d180: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
d190: 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
d1a0: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
d1b0: 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
d1c0: 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
d1d0: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
d1e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
d1f0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
d200: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
d210: 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
d220: 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76     /* Alternativ
d230: 65 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69  e data destinati
d240: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
d250: 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a  pDelete = 0;  /*
d260: 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65   Chain of simple
d270: 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65   selects to dele
d280: 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
d290: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
d2a0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d2b0: 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20  tion */.#ifndef 
d2c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
d2d0: 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
d2f0: 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
d300: 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
d310: 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
d320: 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
d330: 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
d340: 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  y */.#endif..  /
d350: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
d360: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
d370: 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
d380: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
d390: 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
d3a0: 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
d3b0: 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
d3c0: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
d3d0: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
d3e0: 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61   LIMIT..  */.  a
d3f0: 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
d400: 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c  Prior );  /* Cal
d410: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75  ling function gu
d420: 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75  arantees this mu
d430: 63 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  ch */.  db = pPa
d440: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f  rse->db;.  pPrio
d450: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
d460: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
d470: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72  >pRightmost!=pPr
d480: 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ior );.  assert(
d490: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
d4a0: 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f  ost==p->pRightmo
d4b0: 73 74 20 29 3b 0a 20 20 64 65 73 74 20 3d 20 2a  st );.  dest = *
d4c0: 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
d4d0: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
d4e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
d4f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
d500: 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
d510: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
d520: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
d530: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
d540: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
d550: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
d560: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d570: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
d580: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
d590: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d5a0: 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
d5b0: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
d5c0: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
d5d0: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
d5e0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
d5f0: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
d600: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
d610: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
d620: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
d630: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
d640: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
d650: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
d660: 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
d670: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
d680: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
d690: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
d6a0: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
d6b0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
d6c0: 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
d6d0: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
d6e0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
d6f0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
d700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d710: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
d720: 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
d730: 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  Parm, p->pEList-
d740: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >nExpr);.    sql
d750: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
d760: 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
d770: 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74 2e 65  RED);.    dest.e
d780: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
d790: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
d7a0: 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54   sure all SELECT
d7b0: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
d7c0: 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  nt have the same
d7d0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
d7e0: 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69  nts.  ** in thei
d7f0: 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20  r result sets.. 
d800: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
d810: 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f  >pEList && pPrio
d820: 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69  r->pEList );.  i
d830: 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
d840: 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr!=pPrior->pEL
d850: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
d860: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d870: 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
d880: 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
d890: 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
d8a0: 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
d8b0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
d8c0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
d8d0: 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
d8e0: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
d8f0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
d900: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d910: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
d920: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20  ompound SELECTs 
d930: 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44  that have an ORD
d940: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
d950: 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
d960: 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ely..  */.  if( 
d970: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
d980: 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
d990: 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61  electOrderBy(pPa
d9a0: 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
d9b0: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
d9c0: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
d9d0: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
d9e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
d9f0: 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
da00: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
da10: 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
da20: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
da30: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
da40: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
da50: 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
da60: 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
da70: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
da80: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
da90: 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
daa0: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
dab0: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
dac0: 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
dad0: 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
dae0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
daf0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
db00: 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
db10: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
db20: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
db30: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
db40: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
db50: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
db60: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
db70: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
db80: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
db90: 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
dba0: 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
dbb0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
dbc0: 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
dbd0: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
dbe0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
dbf0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
dc00: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a  AddOp1(v, OP_IfZ
dc10: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  ero, p->iLimit);
dc20: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
dc30: 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
dc40: 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
dc50: 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
dc60: 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  }.      explainS
dc70: 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
dc80: 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
dc90: 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
dca0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
dcb0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
dcc0: 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
dcd0: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
dce0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
dcf0: 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
dd00: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
dd10: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
dd20: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b   p->nSelectRow +
dd30: 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
dd40: 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  tRow;.      if( 
dd50: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20  pPrior->pLimit. 
dd60: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
dd70: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50  ExprIsInteger(pP
dd80: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e  rior->pLimit, &n
dd90: 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26  Limit).       &&
dda0: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
ddb0: 20 28 64 6f 75 62 6c 65 29 6e 4c 69 6d 69 74 20   (double)nLimit 
ddc0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
ddd0: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
dde0: 3d 20 28 64 6f 75 62 6c 65 29 6e 4c 69 6d 69 74  = (double)nLimit
ddf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
de00: 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
de10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
de20: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
de30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
de40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
de50: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
de60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
de70: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
de80: 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
de90: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
dea0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
deb0: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
dec0: 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ult */.      u8 
ded0: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  op = 0;       /*
dee0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
def0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
df00: 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
df10: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
df20: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
df30: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
df40: 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
df50: 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
df60: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
df70: 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
df80: 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
df90: 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
dfa0: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
dfb0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
dfc0: 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
dfd0: 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
dfe0: 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
dff0: 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
e000: 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
e010: 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
e020: 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
e030: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
e040: 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
e050: 72 4f 70 20 26 26 20 41 4c 57 41 59 53 28 21 70  rOp && ALWAYS(!p
e060: 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d 3e 70  ->pLimit &&!p->p
e070: 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 20  Offset) ){.     
e080: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
e090: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
e0a0: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
e0b0: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
e0c0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
e0d0: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
e0e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e0f0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 20  ->pRightmost!=p 
e100: 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20  );  /* Can only 
e110: 68 61 70 70 65 6e 20 66 6f 72 20 6c 65 66 74 77  happen for leftw
e120: 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20  ard elements.   
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61 79 20    ** of a 3-way 
e160: 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75 6e 64  or more compound
e170: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
e180: 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
e190: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
e1a0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
e1b0: 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
e1c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e1d0: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
e1e0: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
e1f0: 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
e200: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
e210: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
e220: 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20  est.iParm;.     
e230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e240: 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
e250: 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
e260: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
e270: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
e280: 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
e290: 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
e2a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e2b0: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61    unionTab = pPa
e2c0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
e2d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e2e0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
e2f0: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
e300: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e310: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
e320: 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ral, unionTab, 0
e330: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
e340: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
e350: 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
e360: 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70         p->addrOp
e370: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
e380: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69  ;.        p->pRi
e390: 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67  ghtmost->selFlag
e3a0: 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
e3b0: 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
e3c0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e3d0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
e3e0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
e3f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e400: 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
e410: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
e420: 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
e430: 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
e440: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
e450: 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
e460: 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
e470: 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab);.      expla
e480: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
e490: 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
e4a0: 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
e4b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
e4c0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
e4d0: 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
e4e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
e4f0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
e500: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e510: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e520: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
e530: 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
e540: 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
e550: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
e560: 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
e570: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
e580: 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
e590: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
e5a0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
e5b0: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
e5c0: 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
e5d0: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
e5e0: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
e5f0: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
e600: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
e610: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
e620: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
e630: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
e640: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
e650: 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
e660: 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70   = op;.      exp
e670: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
e680: 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
e690: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
e6a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e6b0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e6c0: 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
e6d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
e6e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
e6f0: 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
e700: 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
e710: 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
e720: 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
e730: 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20  derBy..      ** 
e740: 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
e750: 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
e760: 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
e770: 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
e780: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
e790: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
e7a0: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
e7b0: 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
e7c0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
e7d0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
e7e0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
e7f0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
e800: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
e810: 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53  TK_UNION ) p->nS
e820: 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
e830: 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
e840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e850: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
e860: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
e870: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
e880: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
e890: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
e8a0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
e8b0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  0;.      p->iOff
e8c0: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  set = 0;..      
e8d0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
e8e0: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
e8f0: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
e900: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
e910: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
e920: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
e930: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
e940: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f      assert( unio
e950: 6e 54 61 62 3d 3d 64 65 73 74 2e 69 50 61 72 6d  nTab==dest.iParm
e960: 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
e970: 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
e980: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
e990: 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
e9a0: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
e9b0: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
e9c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e9d0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
e9e0: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
e9f0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
ea00: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
ea10: 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
ea20: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
ea30: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
ea40: 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
ea50: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
ea60: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
ea70: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
ea80: 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
ea90: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
eaa0: 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
eab0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
eac0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
ead0: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
eae0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
eaf0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
eb00: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
eb10: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
eb20: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
eb30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
eb40: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
eb50: 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
eb60: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
eb70: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
eb80: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
eb90: 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
eba0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
ebb0: 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
ebc0: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
ebd0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
ebf0: 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74  -1, &dest, iCont
ec00: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ec10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
ec20: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
ec30: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
ec40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ec50: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
ec60: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
ec70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ec80: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
ec90: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
eca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ecb0: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
ecc0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
ecd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
ece0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
ecf0: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
ed00: 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  p->op==TK_INTERS
ed10: 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ECT ); {.      i
ed20: 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
ed30: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
ed40: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
ed50: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
ed60: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20  it, *pOffset;.  
ed70: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
ed80: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69      SelectDest i
ed90: 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20  ntersectdest;.  
eda0: 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20      int r1;..   
edb0: 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
edc0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
edd0: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
ede0: 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
edf0: 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
ee00: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
ee10: 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
ee20: 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
ee30: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
ee40: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
ee50: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
ee60: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ee70: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
ee80: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
ee90: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
eea0: 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
eeb0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
eec0: 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20   );..      addr 
eed0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
eee0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
eef0: 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30  hemeral, tab1, 0
ef00: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ef10: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
ef20: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
ef30: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
ef40: 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
ef50: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
ef60: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  t->selFlags |= S
ef70: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
ef80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ef90: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
efa0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
efb0: 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
efc0: 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
efd0: 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
efe0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
eff0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
f000: 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
f010: 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
f020: 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70  tab1);.      exp
f030: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
f040: 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
f050: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
f060: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f070: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
f080: 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
f090: 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
f0a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
f0b0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f0c0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
f0d0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
f0e0: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
f0f0: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
f100: 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
f110: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
f120: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f130: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
f140: 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
f150: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
f160: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
f170: 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
f180: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
f190: 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
f1a0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
f1b0: 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
f1c0: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
f1d0: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
f1e0: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
f1f0: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
f200: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
f210: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
f220: 73 65 63 74 64 65 73 74 2e 69 50 61 72 6d 20 3d  sectdest.iParm =
f230: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70   tab2;.      exp
f240: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
f250: 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
f260: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
f270: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f280: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
f290: 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
f2a0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f2b0: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
f2c0: 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74   );.      pDelet
f2d0: 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
f2e0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
f2f0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
f300: 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
f310: 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
f320: 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
f330: 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
f340: 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
f350: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
f360: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
f370: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
f380: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
f390: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
f3a0: 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f  Offset;..      /
f3b0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f3c0: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
f3d0: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
f3e0: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
f3f0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
f400: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
f410: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
f420: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
f430: 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
f440: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53  put ){.        S
f450: 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
f460: 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  p;.        while
f470: 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
f480: 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
f490: 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
f4a0: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
f4b0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
f4c0: 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
f4d0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
f4e0: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
f4f0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
f500: 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20  v);.      iCont 
f510: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
f520: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
f530: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
f540: 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
f550: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
f560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f570: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
f580: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
f590: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
f5a0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f5b0: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61  rse);.      iSta
f5c0: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
f5d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
f5e0: 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  Key, tab1, r1);.
f5f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f600: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
f610: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
f620: 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a   iCont, r1, 0);.
f630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
f640: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
f650: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
f660: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
f670: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
f680: 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45  ist, tab1, p->pE
f690: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6b0: 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c     0, -1, &dest,
f6c0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
f6d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f6e0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
f6f0: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
f700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f710: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
f720: 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
f730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
f740: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
f750: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
f760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f770: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
f780: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
f790: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f7a0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
f7b0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
f7c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
f7d0: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
f7e0: 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
f7f0: 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e  Sub1, iSub2, p->
f800: 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20  op!=TK_ALL);..  
f810: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
f820: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
f830: 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
f840: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
f850: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
f860: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
f870: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
f880: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
f890: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
f8a0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
f8b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
f8c0: 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
f8d0: 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
f8e0: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
f8f0: 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
f900: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
f910: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
f920: 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
f930: 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
f940: 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
f950: 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
f960: 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
f970: 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
f980: 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
f990: 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
f9a0: 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
f9b0: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
f9c0: 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
f9d0: 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
f9e0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
f9f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
fa00: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
fa10: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
fa20: 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
fa30: 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
fa40: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
fa50: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
fa60: 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fa80: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
fa90: 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
faa0: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
fab0: 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fad0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
fae0: 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
faf0: 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
fb00: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
fb10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fb20: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
fb30: 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
fb40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
fb50: 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b  pRightmost==p );
fb60: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  .    nCol = p->p
fb70: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
fb80: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
fb90: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
fba0: 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  (db,.           
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
fbc0: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43  of(*pKeyInfo)+nC
fbd0: 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ol*(sizeof(CollS
fbe0: 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20  eq*) + 1));.    
fbf0: 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
fc00: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
fc10: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
fc20: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
fc30: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
fc40: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20    pKeyInfo->enc 
fc50: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70  = ENC(db);.    p
fc60: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
fc70: 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a 20 20  = (u16)nCol;..  
fc80: 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
fc90: 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
fca0: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
fcb0: 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
fcc0: 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
fcd0: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
fce0: 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
fcf0: 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
fd00: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
fd10: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
fd20: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
fd30: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f    }..    for(pLo
fd40: 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
fd50: 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
fd60: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
fd70: 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
fd80: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
fd90: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
fda0: 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
fdb0: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
fdc0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
fdd0: 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
fde0: 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
fdf0: 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
fe00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
fe10: 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
fe20: 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
fe30: 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
fe40: 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
fe50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
fe60: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
fe70: 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
fe80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fe90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
fea0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
feb0: 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
fec0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
fed0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
fee0: 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70  , addr, (char*)p
fef0: 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
ff00: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
ff10: 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
ff20: 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
ff30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
ff40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
ff50: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
ff60: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
ff70: 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d  .  pDest->iMem =
ff80: 20 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44   dest.iMem;.  pD
ff90: 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74  est->nMem = dest
ffa0: 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  .nMem;.  sqlite3
ffb0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
ffc0: 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74   pDelete);.  ret
ffd0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
ffe0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
fff0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
10000 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
10010 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
10020 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
10030 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
10040 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
10050 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
10060 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
10070 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
10080 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65  ined in pIn->iMe
10090 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  m.  There are.**
100a0 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d   pIn->nMem colum
100b0 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  ns to be output.
100c0 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65    pDest is where
100d0 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75   the output shou
100e0 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a  ld.** be sent..*
100f0 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69  *.** regReturn i
10100 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
10110 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  the register hol
10120 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
10130 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64  ine.** return ad
10140 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dress..**.** If 
10150 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69  regPrev>0 then i
10160 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  t is the first r
10170 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63  egister in a vec
10180 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f  tor that.** reco
10190 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  rds the previous
101a0 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65   output.  mem[re
101b0 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67  gPrev] is a flag
101c0 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a   that is false.*
101d0 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  * if there has b
101e0 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  een no previous 
101f0 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50  output.  If regP
10200 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  rev>0 then code 
10210 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  is.** generated 
10220 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c  to suppress dupl
10230 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66  icates.  pKeyInf
10240 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f  o is used for co
10250 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e  mparing.** keys.
10260 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49  .**.** If the LI
10270 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e  MIT found in p->
10280 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65  iLimit is reache
10290 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  d, jump immediat
102a0 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b  ely to.** iBreak
102b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
102c0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
102d0 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73  broutine(.  Pars
102e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
102f0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
10300 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10310 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
10320 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
10330 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
10340 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e   SelectDest *pIn
10350 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f  ,        /* Coro
10360 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20  utine supplying 
10370 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
10380 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
10390 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65    /* Where to se
103a0 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  nd the data */. 
103b0 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20   int regReturn, 
103c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
103d0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  return address r
103e0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
103f0 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20   regPrev,       
10400 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
10410 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
10420 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73  .  No uniqueness
10430 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e   if 0 */.  KeyIn
10440 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
10450 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72     /* For compar
10460 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75  ing with previou
10470 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  s entry */.  int
10480 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20   p4type,        
10490 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20 74       /* The p4 t
104a0 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f  ype for pKeyInfo
104b0 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
104d0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
104e0 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
104f0 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
10500 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
10510 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
10520 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
10530 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
10540 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10550 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
10560 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
10570 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
10580 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
10590 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
105a0 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
105b0 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
105c0 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
105d0 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a  nt j1, j2;.    j
105e0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
105f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
10600 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  t, regPrev);.   
10610 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
10620 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
10630 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  mpare, pIn->iMem
10640 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
10650 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->nMem,.        
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
10680 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a  yInfo, p4type);.
10690 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
106a0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
106b0 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75  , j2+2, iContinu
106c0 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71  e, j2+2);.    sq
106d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
106e0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71  e(v, j1);.    sq
106f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
10700 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  y(pParse, pIn->i
10710 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  Mem, regPrev+1, 
10720 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
10730 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10740 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
10750 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
10760 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
10770 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10780 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
10790 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
107a0 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
107b0 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
107c0 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
107d0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
107e0 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
107f0 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69  ontinue);..  swi
10800 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
10810 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
10820 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
10830 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
10840 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
10850 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
10860 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
10870 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
10880 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
10890 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
108a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
108b0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
108c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
108d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
108e0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
108f0 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
10900 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
10910 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
10920 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
10930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10940 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
10950 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70  rd, pIn->iMem, p
10960 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b 0a 20  In->nMem, r1);. 
10970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10980 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
10990 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 50  Rowid, pDest->iP
109a0 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
109b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
109c0 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
109d0 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31  pDest->iParm, r1
109e0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
109f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
10a00 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
10a10 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
10a20 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
10a30 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
10a40 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
10a50 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
10a60 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
10a70 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
10a80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
10a90 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
10aa0 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
10ab0 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
10ac0 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
10ad0 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
10ae0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
10af0 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
10b00 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
10b10 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
10b20 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
10b30 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
10b40 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
10b50 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
10b60 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
10b70 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
10b80 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
10b90 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nMem==1 );.     
10ba0 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 0a   p->affinity = .
10bb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10bc0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
10bd0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
10be0 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
10bf0 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 72  finity);.      r
10c00 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
10c10 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
10c20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10c30 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
10c40 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d  eRecord, pIn->iM
10c50 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61  em, 1, r1, &p->a
10c60 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
10c70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
10c80 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
10c90 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
10ca0 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  Mem, 1);.      s
10cb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10cc0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
10cd0 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
10ce0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
10cf0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
10d00 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
10d10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10d20 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65  ..#if 0  /* Neve
10d30 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f  r occurs on an O
10d40 52 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f  RDER BY query */
10d50 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
10d60 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
10d70 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
10d80 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
10d90 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
10da0 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
10db0 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
10dc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10dd0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
10de0 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20  pDest->iParm);. 
10df0 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
10e00 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
10e10 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
10e20 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
10e30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
10e40 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
10e50 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
10e60 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
10e70 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
10e80 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
10e90 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
10ea0 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
10eb0 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
10ec0 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
10ed0 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
10ee0 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
10ef0 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
10f00 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
10f10 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31  rt( pIn->nMem==1
10f20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
10f30 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
10f40 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  arse, pIn->iMem,
10f50 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 31   pDest->iParm, 1
10f60 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
10f70 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
10f80 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
10f90 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
10fa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10fb0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
10fc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10fd0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
10fe0 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
10ff0 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
11000 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
11010 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
11020 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
11030 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 6e 20 74 68  ->iMem.  Then th
11040 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65  e co-routine yie
11050 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lds..    */.    
11060 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
11070 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ne: {.      if( 
11080 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29  pDest->iMem==0 )
11090 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
110a0 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 47  >iMem = sqlite3G
110b0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
110c0 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  se, pIn->nMem);.
110d0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
110e0 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d 65 6d 3b  Mem = pIn->nMem;
110f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11100 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
11110 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
11120 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 4d 65  iMem, pDest->iMe
11130 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 29 3b  m, pDest->nMem);
11140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11150 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
11160 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61  ield, pDest->iPa
11170 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
11180 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11190 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
111a0 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
111b0 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f  esult destinatio
111c0 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  n must be.    **
111d0 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68   SRT_Output.  Th
111e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
111f0 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
11200 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  any other.    **
11210 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
11220 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73  er than the ones
11230 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f   handled above o
11240 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20  r SRT_Output..  
11250 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
11260 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75  SRT_Output, resu
11270 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
11280 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
11290 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20  registers.  .   
112a0 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f   ** Then the OP_
112b0 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
112c0 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73   is used to caus
112d0 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
112e0 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   to.    ** retur
112f0 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  n the next row o
11300 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  f result..    */
11310 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
11320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
11330 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
11340 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
11350 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11360 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
11370 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49  w, pIn->iMem, pI
11380 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  n->nMem);.      
11390 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
113a0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
113b0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
113c0 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  , pIn->nMem);.  
113d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
113e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
113f0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
11400 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
11410 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
11420 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
11430 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
11440 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11450 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
11460 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d  Limit, iBreak, -
11470 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  1);.  }..  /* Ge
11480 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
11490 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
114a0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
114b0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
114c0 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
114d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
114e0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
114f0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
11500 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
11510 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
11520 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
11530 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
11540 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
11550 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
11560 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
11570 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
11580 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
11590 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
115a0 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
115b0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
115c0 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
115d0 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
115e0 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
115f0 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
11600 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
11610 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
11620 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
11630 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
11640 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
11650 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
11660 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11670 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
11680 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
11690 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
116a0 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
116b0 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
116c0 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
116d0 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
116e0 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
116f0 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
11700 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
11710 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
11720 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
11730 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
11740 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
11750 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
11760 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
11770 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
11780 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
11790 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
117a0 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
117b0 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
117c0 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
117d0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
117e0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
117f0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
11800 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
11810 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
11820 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
11830 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
11840 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
11850 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
11860 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
11870 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
11880 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
11890 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
118a0 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
118b0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
118c0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
118d0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
118e0 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
118f0 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
11900 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
11910 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
11920 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
11930 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
11940 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
11950 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
11960 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
11970 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
11980 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
11990 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
119a0 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
119b0 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
119c0 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
119d0 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
119e0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
119f0 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
11a00 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
11a10 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
11a20 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
11a30 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
11a40 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
11a50 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
11a60 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
11a70 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
11a80 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
11a90 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
11aa0 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
11ab0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
11ac0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
11ad0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
11ae0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
11af0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
11b00 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
11b10 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
11b20 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
11b30 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
11b40 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
11b50 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
11b60 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
11b70 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
11b80 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
11b90 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
11ba0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
11bb0 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
11bc0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
11bd0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
11be0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
11bf0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
11c00 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
11c10 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
11c20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
11c30 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
11c40 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
11c50 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
11c60 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
11c70 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
11c80 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
11c90 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
11ca0 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
11cb0 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
11cc0 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
11cd0 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
11ce0 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
11cf0 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
11d00 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
11d10 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
11d20 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
11d30 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
11d40 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
11d50 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
11d60 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
11d70 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
11d80 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
11d90 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
11da0 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
11db0 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
11dc0 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
11dd0 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
11de0 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
11df0 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
11e00 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
11e10 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
11e20 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
11e30 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
11e40 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
11e50 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
11e60 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
11e70 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
11e80 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
11e90 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
11ea0 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
11eb0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
11ec0 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
11ed0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
11ee0 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
11ef0 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
11f00 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
11f10 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
11f20 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
11f30 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
11f40 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
11f50 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
11f60 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
11f70 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
11f80 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
11f90 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
11fa0 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
11fb0 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
11fc0 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
11fd0 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
11fe0 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
11ff0 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
12000 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
12010 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
12020 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
12030 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
12040 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
12050 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
12060 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
12070 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
12080 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
12090 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
120a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
120b0 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
120c0 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
120d0 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
120e0 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
120f0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
12100 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
12110 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
12120 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
12130 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
12140 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
12150 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
12160 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
12170 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
12180 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
12190 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
121a0 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
121b0 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
121c0 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
121d0 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
121e0 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
121f0 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
12200 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
12210 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
12220 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
12230 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
12240 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
12250 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
12260 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
12270 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
12280 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
12290 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
122a0 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
122b0 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
122c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
122d0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
122e0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
122f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
12300 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
12310 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
12320 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12330 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12340 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12350 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12360 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
12370 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
12380 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
12390 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
123a0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
123b0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
123c0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
123d0 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
123e0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
123f0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
12400 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
12410 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
12420 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
12430 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
12440 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
12450 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
12460 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
12470 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
12480 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
12490 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
124a0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
124b0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
124c0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
124d0 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20 20  int regEofA;    
124e0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f        /* Flag to
124f0 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73   indicate when s
12500 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c  elect-A is compl
12510 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ete */.  int reg
12520 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f  AddrB;         /
12530 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
12540 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20  er for select-B 
12550 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
12560 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20 20  nt regEofB;     
12570 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20       /* Flag to 
12580 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65  indicate when se
12590 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65  lect-B is comple
125a0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  te */.  int addr
125b0 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a  SelectA;      /*
125c0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
125d0 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
125e0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
125f0 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a  SelectB;      /*
12600 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
12610 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
12620 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
12630 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utA;          /*
12640 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
12650 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
12660 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
12670 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20  .  int regOutB; 
12680 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
12690 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
126a0 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
126b0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
126c0 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20  t addrOutA;     
126d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
126e0 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  f the output-A s
126f0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
12700 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b  nt addrOutB = 0;
12710 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12720 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  of the output-B 
12730 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
12740 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20  int addrEofA;   
12750 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12760 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
12770 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
12780 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
12790 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
127a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
127b0 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
127c0 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
127d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
127e0 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
127f0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
12800 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
12810 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
12820 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
12830 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
12840 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
12850 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
12860 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12870 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
12880 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
12890 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
128a0 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
128b0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
128c0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
128d0 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
128e0 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
128f0 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
12900 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
12910 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
12920 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
12930 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
12940 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
12950 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
12960 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
12970 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
12980 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
12990 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
129a0 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
129b0 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
129c0 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
129d0 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
129e0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
129f0 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
12a00 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
12a10 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
12a20 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
12a30 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
12a40 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
12a50 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
12a60 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
12a70 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
12a80 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
12a90 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
12aa0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
12ab0 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
12ac0 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
12ad0 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
12ae0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
12af0 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
12b00 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
12b10 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
12b20 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
12b30 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
12b40 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
12b50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
12b60 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
12b70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
12b80 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12b90 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12ba0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
12bb0 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
12bc0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12bd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
12be0 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
12bf0 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
12c00 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
12c10 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
12c20 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
12c30 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
12c40 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
12c50 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
12c60 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66  lumns */.#ifndef
12c70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
12c80 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
12c90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12ca0 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
12cb0 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
12cc0 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
12cd0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
12ce0 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
12cf0 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
12d00 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
12d10 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
12d20 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
12d30 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
12d40 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
12d50 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
12d60 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
12d70 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
12d80 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
12d90 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
12da0 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
12db0 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
12dc0 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
12dd0 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
12de0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
12df0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
12e00 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
12e10 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
12e20 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
12e30 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
12e40 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
12e50 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
12e60 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
12e70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
12e80 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
12e90 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
12ea0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
12eb0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
12ec0 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
12ed0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
12ee0 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
12ef0 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
12f00 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
12f10 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
12f20 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
12f30 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
12f40 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
12f50 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
12f60 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
12f70 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
12f80 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
12f90 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
12fa0 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
12fb0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
12fc0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
12fd0 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
12fe0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12ff0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
13000 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
13010 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
13020 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
13030 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
13040 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
13050 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13060 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a  Item->iCol>0 );.
13070 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
13080 6d 2d 3e 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65  m->iCol==i ) bre
13090 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
130a0 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42    if( j==nOrderB
130b0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  y ){.        Exp
130c0 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
130d0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54  3Expr(db, TK_INT
130e0 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20  EGER, 0);.      
130f0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
13100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13110 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
13120 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
13130 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
13140 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
13150 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = i;.        pOr
13160 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
13170 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
13180 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
13190 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  pNew);.        p
131a0 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65  OrderBy->a[nOrde
131b0 72 42 79 2b 2b 5d 2e 69 43 6f 6c 20 3d 20 28 75  rBy++].iCol = (u
131c0 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  16)i;.      }.  
131d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
131e0 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72  mpute the compar
131f0 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e  ison permutation
13200 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61   and keyinfo tha
13210 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20  t is used with. 
13220 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74   ** the permutat
13230 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65  ion used to dete
13240 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78  rmine if the nex
13250 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65  t.  ** row of re
13260 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d  sults comes from
13270 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65   selectA or sele
13280 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65  ctB.  Also add e
13290 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c  xplicit.  ** col
132a0 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f  lations to the O
132b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
132c0 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65  erms so that whe
132d0 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
132e0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67  .  ** to the rig
132f0 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20  ht and the left 
13300 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74  are evaluated, t
13310 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72  hey use the corr
13320 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  ect.  ** collati
13330 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d  on..  */.  aPerm
13340 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ute = sqlite3DbM
13350 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
13360 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42  eof(int)*nOrderB
13370 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  y);.  if( aPermu
13380 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
13390 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
133a0 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69  pItem;.    for(i
133b0 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
133c0 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42  By->a; i<nOrderB
133d0 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; i++, pItem++)
133e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
133f0 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26  pItem->iCol>0  &
13400 26 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70  & pItem->iCol<=p
13410 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
13420 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
13430 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43  e[i] = pItem->iC
13440 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol - 1;.    }.  
13450 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20    pKeyMerge =.  
13460 20 20 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c      sqlite3DbMal
13470 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
13480 66 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f  f(*pKeyMerge)+nO
13490 72 64 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43  rderBy*(sizeof(C
134a0 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20  ollSeq*)+1));.  
134b0 20 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20    if( pKeyMerge 
134c0 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72  ){.      pKeyMer
134d0 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  ge->aSortOrder =
134e0 20 28 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65   (u8*)&pKeyMerge
134f0 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79  ->aColl[nOrderBy
13500 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72  ];.      pKeyMer
13510 67 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  ge->nField = (u1
13520 36 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  6)nOrderBy;.    
13530 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63    pKeyMerge->enc
13540 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
13550 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
13560 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
13570 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
13580 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70  oll;.        Exp
13590 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65  r *pTerm = pOrde
135a0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
135b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
135c0 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  rm->flags & EP_E
135d0 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  xpCollate ){.   
135e0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
135f0 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Term->pColl;.   
13600 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13610 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75        pColl = mu
13620 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
13630 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72  (pParse, p, aPer
13640 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  mute[i]);.      
13650 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73      pTerm->flags
13660 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
13670 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e;.          pTe
13680 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  rm->pColl = pCol
13690 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l;.        }.   
136a0 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
136b0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
136c0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65  ;.        pKeyMe
136d0 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  rge->aSortOrder[
136e0 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
136f0 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
13700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13710 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65  else{.    pKeyMe
13720 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rge = 0;.  }..  
13730 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20  /* Reattach the 
13740 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13750 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  to the query..  
13760 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
13770 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
13780 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
13790 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
137a0 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  tDup(pParse->db,
137b0 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a   pOrderBy, 0);..
137c0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
137d0 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61  range of tempora
137e0 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ry registers and
137f0 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65   the KeyInfo nee
13800 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ded.  ** for the
13810 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f   logic that remo
13820 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65  ves duplicate re
13830 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74  sult rows when t
13840 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  he.  ** operator
13850 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50   is UNION, EXCEP
13860 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20  T, or INTERSECT 
13870 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41  (but not UNION A
13880 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LL)..  */.  if( 
13890 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
138a0 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20    regPrev = 0;. 
138b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
138c0 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  nExpr = p->pELis
138d0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73  t->nExpr;.    as
138e0 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d  sert( nOrderBy>=
138f0 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
13900 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
13910 20 72 65 67 50 72 65 76 20 3d 20 73 71 6c 69 74   regPrev = sqlit
13920 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
13930 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b  Parse, nExpr+1);
13940 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13950 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
13960 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76  eger, 0, regPrev
13970 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d  );.    pKeyDup =
13980 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
13990 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
139a0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
139b0 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45  f(*pKeyDup) + nE
139c0 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  xpr*(sizeof(Coll
139d0 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20  Seq*)+1) );.    
139e0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
139f0 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53       pKeyDup->aS
13a00 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
13a10 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b  &pKeyDup->aColl[
13a20 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b  nExpr];.      pK
13a30 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  eyDup->nField = 
13a40 28 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20  (u16)nExpr;.    
13a50 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d    pKeyDup->enc =
13a60 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20   ENC(db);.      
13a70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
13a80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13a90 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
13aa0 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
13ab0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13ac0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
13ad0 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
13ae0 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
13af0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
13b00 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
13b10 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
13b20 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
13b30 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
13b40 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
13b50 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
13b60 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
13b70 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
13b80 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
13b90 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
13ba0 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
13bb0 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
13bc0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
13bd0 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
13be0 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
13bf0 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
13c00 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
13c10 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
13c20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
13c30 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
13c40 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
13c50 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
13c60 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
13c70 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
13c80 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
13c90 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
13ca0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
13cb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13cc0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
13cd0 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
13ce0 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
13cf0 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d10 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
13d20 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
13d30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13d40 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
13d50 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
13d60 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
13d70 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
13d80 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
13d90 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
13da0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
13db0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
13dc0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
13dd0 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
13de0 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
13df0 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
13e00 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13e10 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b  m;.  regEofA = +
13e20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
13e30 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50   regAddrB = ++pP
13e40 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
13e50 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65  gEofB = ++pParse
13e60 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
13e70 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
13e80 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
13e90 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
13ea0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
13eb0 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
13ec0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
13ed0 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
13ee0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
13ef0 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
13f00 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
13f10 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70  B);..  /* Jump p
13f20 61 73 74 20 74 68 65 20 76 61 72 69 6f 75 73 20  ast the various 
13f30 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20  subroutines and 
13f40 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68  coroutines to th
13f50 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67  e main.  ** merg
13f60 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31  e loop.  */.  j1
13f70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13f80 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
13f90 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  ;.  addrSelectA 
13fa0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
13fb0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20  rentAddr(v);... 
13fc0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
13fd0 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
13fe0 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
13ff0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
14000 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
14010 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
14020 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
14030 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
14040 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
14050 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e   "Begin coroutin
14060 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43  e for left SELEC
14070 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
14080 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
14090 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  tA;.  explainSet
140a0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
140b0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
140c0 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
140d0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
140e0 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
140f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14100 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
14110 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 1, regEofA);.
14120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14130 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
14140 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64   regAddrA);.  Vd
14150 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
14160 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65  , "End coroutine
14170 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54   for left SELECT
14180 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  "));..  /* Gener
14190 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
141a0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
141b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
141c0 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
141d0 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
141e0 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
141f0 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
14200 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14210 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  (v);.  VdbeNoopC
14220 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
14230 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
14240 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
14250 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
14260 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
14270 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
14280 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
14290 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
142a0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
142b0 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  ;  .  explainSet
142c0 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
142d0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
142e0 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
142f0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14300 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e  , &destB);.  p->
14310 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
14320 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
14330 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
14340 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14350 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
14360 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29 3b  er, 1, regEofB);
14370 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14380 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
14390 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 56  , regAddrB);.  V
143a0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
143b0 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e  v, "End coroutin
143c0 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45  e for right SELE
143d0 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  CT"));..  /* Gen
143e0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
143f0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
14400 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
14410 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65  of the A.  ** se
14420 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
14430 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
14440 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
14450 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
14460 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
14470 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
14480 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f  or A"));.  addrO
14490 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utA = generateOu
144a0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
144b0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
144c0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
144d0 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  A, pDest, regOut
144e0 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  A,.             
144f0 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
14500 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  yDup, P4_KEYINFO
14510 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65 6c 45  _HANDOFF, labelE
14520 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
14530 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
14540 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
14550 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
14560 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
14570 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
14580 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
14590 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
145a0 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
145b0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
145c0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
145d0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
145e0 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
145f0 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
14600 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
14610 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
14620 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
14650 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
14660 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
14670 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34  rev, pKeyDup, P4
14680 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 2c  _KEYINFO_STATIC,
14690 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
146a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
146b0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
146c0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
146d0 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
146e0 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
146f0 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
14700 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
14710 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56  emains..  */.  V
14720 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
14730 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
14740 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28 20 6f  tine"));.  if( o
14750 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
14760 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
14770 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
14780 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14790 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
147a0 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   0, labelEnd);. 
147b0 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 61 64   }else{  .    ad
147c0 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
147d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
147e0 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61  _If, regEofB, la
147f0 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  belEnd);.    sql
14800 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14810 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
14820 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
14830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14840 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
14850 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
14860 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14870 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
14880 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  0, addrEofA);.  
14890 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
148a0 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
148b0 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ctRow;.  }..  /*
148c0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
148d0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
148e0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
148f0 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
14900 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
14910 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
14920 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
14930 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
14940 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
14950 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
14960 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
14970 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
14980 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
14990 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
149a0 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
149b0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
149c0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
149d0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
149e0 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
149f0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
14a00 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
14a10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
14a20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e  regEofA, labelEn
14a30 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
14a40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14a50 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
14a60 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
14a70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14a80 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
14a90 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c  gAddrA);.    sql
14aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14ab0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
14ac0 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20  drEofB);.  }..  
14ad0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
14ae0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
14af0 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a  ase of A<B.  */.
14b00 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
14b10 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75  t((v, "A-lt-B su
14b20 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
14b30 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65  ddrAltB = sqlite
14b40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14b50 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
14b60 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73  , addrOutA);.  s
14b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14b80 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
14b90 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
14ba0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14bb0 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
14bc0 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c  addrEofA);.  sql
14bd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14be0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
14bf0 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
14c00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14c10 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
14c20 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
14c30 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
14c40 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
14c50 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
14c60 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
14c70 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
14c80 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
14c90 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
14ca0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
14cb0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
14cc0 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
14cd0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
14ce0 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
14cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14d00 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
14d10 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c  gAddrA);.    sql
14d20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14d30 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
14d40 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
14d50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14d60 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
14d70 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
14d80 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
14d90 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
14da0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
14db0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
14dc0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
14dd0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
14de0 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
14df0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
14e00 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
14e10 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
14e20 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
14e30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14e40 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
14e50 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
14e60 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
14e70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14e80 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
14e90 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rB);.  sqlite3Vd
14ea0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
14eb0 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72  f, regEofB, addr
14ec0 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
14ed0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14ee0 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
14ef0 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
14f00 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
14f10 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
14f20 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
14f30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14f40 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73  Here(v, j1);.  s
14f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14f60 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14f70 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73  0, regEofA);.  s
14f80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14f90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14fa0 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73  0, regEofB);.  s
14fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14fc0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
14fd0 67 41 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65  gAddrA, addrSele
14fe0 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ctA);.  sqlite3V
14ff0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15000 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c  Gosub, regAddrB,
15010 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
15020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15030 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
15040 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  EofA, addrEofA);
15050 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15060 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
15070 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42  egEofB, addrEofB
15080 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
15090 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
150a0 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
150b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
150c0 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
150d0 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
150e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
150f0 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
15100 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
15110 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
15120 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
15130 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
15140 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 4d 65  mpare, destA.iMe
15150 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20 6e  m, destB.iMem, n
15160 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15180 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72    (char*)pKeyMer
15190 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ge, P4_KEYINFO_H
151a0 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74  ANDOFF);.  sqlit
151b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
151c0 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74  OP_Jump, addrAlt
151d0 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64  B, addrAeqB, add
151e0 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65  rAgtB);..  /* Re
151f0 6c 65 61 73 65 20 74 65 6d 70 6f 72 61 72 79 20  lease temporary 
15200 72 65 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20  registers.  */. 
15210 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
15220 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
15230 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
15240 73 65 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f 72  se, regPrev, nOr
15250 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20  derBy+1);.  }.. 
15260 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
15270 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
15280 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  der to terminate
15290 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
152a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
152b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
152c0 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53  belEnd);..  /* S
152d0 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
152e0 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a   output columns.
152f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
15300 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
15310 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  put ){.    Selec
15320 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69  t *pFirst = pPri
15330 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  or;.    while( p
15340 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
15350 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
15360 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e  >pPrior;.    gen
15370 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
15380 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
15390 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st->pEList);.  }
153a0 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c  ..  /* Reassembl
153b0 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  y the compound q
153c0 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20  uery so that it 
153d0 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f  will be freed co
153e0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  rrectly.  ** by 
153f0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
15400 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tion */.  if( p-
15410 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73  >pPrior ){.    s
15420 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
15430 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  te(db, p->pPrior
15440 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
15450 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20  or = pPrior;..  
15460 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
15470 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
15480 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
15490 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
154a0 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
154b0 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c  ies ****/.  expl
154c0 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
154d0 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
154e0 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20  1, iSub2, 0);.  
154f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15500 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
15510 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15520 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
15530 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
15540 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20  E_OMIT_VIEW)./* 
15550 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
15560 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
15570 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
15580 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72  t(sqlite3*, Expr
15590 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72  List*, int, Expr
155a0 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
155b0 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
155c0 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74  sqlite3*, Select
155d0 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
155e0 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  t *);../*.** Sca
155f0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
15600 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
15610 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
15620 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
15630 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
15640 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
15650 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
15660 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
15670 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
15680 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
15690 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
156a0 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
156b0 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
156c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
156d0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
156e0 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
156f0 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
15700 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
15710 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
15720 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
15730 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
15740 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
15750 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
15760 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
15770 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
15780 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
15790 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
157a0 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
157b0 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
157c0 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
157d0 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
157e0 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
157f0 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
15800 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
15810 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
15820 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
15830 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
15840 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
15850 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
15860 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
15870 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
15880 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
15890 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
158a0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
158b0 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
158c0 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
158d0 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
158e0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
158f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
15900 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
15910 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
15920 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
15930 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
15940 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
15950 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
15960 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
15970 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
15980 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
15990 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
159a0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
159b0 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
159c0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
159d0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
159e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
159f0 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
15a00 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
15a10 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
15a20 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
15a30 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
15a40 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
15a50 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
15a60 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
15a70 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
15a80 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  b, pEList->a[pEx
15a90 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
15aa0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  pr, 0);.      if
15ab0 28 20 70 4e 65 77 20 26 26 20 70 45 78 70 72 2d  ( pNew && pExpr-
15ac0 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >pColl ){.      
15ad0 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20    pNew->pColl = 
15ae0 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  pExpr->pColl;.  
15af0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
15b00 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
15b10 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
15b20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
15b30 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
15b40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
15b50 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
15b60 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
15b70 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
15b80 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
15b90 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
15ba0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
15bb0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
15bc0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
15bd0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
15be0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
15bf0 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
15c00 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  (db, pExpr->x.pS
15c10 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
15c20 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  EList);.    }els
15c30 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  e{.      substEx
15c40 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72  prList(db, pExpr
15c50 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c  ->x.pList, iTabl
15c60 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
15c70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
15c80 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Expr;.}.static v
15c90 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
15ca0 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
15cb0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
15cc0 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
15cd0 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72  s here */.  Expr
15ce0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
15cf0 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e   /* List to scan
15d00 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f   and in which to
15d10 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65   make substitute
15d20 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
15d30 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
15d40 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
15d50 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
15d60 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
15d70 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
15d80 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  alues */.){.  in
15d90 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
15da0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
15db0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
15dc0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
15dd0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70     pList->a[i].p
15de0 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72  Expr = substExpr
15df0 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
15e00 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20  .pExpr, iTable, 
15e10 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73  pEList);.  }.}.s
15e20 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
15e30 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65  Select(.  sqlite
15e40 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
15e50 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
15e60 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
15e70 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
15e80 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
15e90 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69  statement in whi
15ea0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
15eb0 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  itutions */.  in
15ec0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
15ed0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
15ee0 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20  e replaced */.  
15ef0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
15f00 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
15f10 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  te values */.){.
15f20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
15f30 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
15f40 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
15f50 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70   int i;.  if( !p
15f60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62   ) return;.  sub
15f70 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
15f80 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65  ->pEList, iTable
15f90 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
15fa0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
15fb0 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62  ->pGroupBy, iTab
15fc0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
15fd0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
15fe0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54   p->pOrderBy, iT
15ff0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16000 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75   p->pHaving = su
16010 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
16020 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
16030 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57  pEList);.  p->pW
16040 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
16050 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
16060 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
16070 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64  .  substSelect(d
16080 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54  b, p->pPrior, iT
16090 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
160a0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
160b0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
160c0 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20  );  /* Even for 
160d0 28 53 45 4c 45 43 54 20 31 29 20 77 65 20 68 61  (SELECT 1) we ha
160e0 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74 20  ve: pSrc!=0 but 
160f0 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f  pSrc->nSrc==0 */
16100 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53  .  if( ALWAYS(pS
16110 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  rc) ){.    for(i
16120 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
16130 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
16140 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
16150 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
16160 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65  t(db, pItem->pSe
16170 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
16180 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
16190 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
161a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
161b0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
161c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
161d0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
161e0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
161f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
16200 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
16210 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
16220 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16230 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
16240 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
16250 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
16260 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
16270 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
16280 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
16290 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
162a0 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
162b0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
162c0 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
162d0 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
162e0 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
162f0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
16300 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
16310 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
16320 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
16330 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
16340 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
16350 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
16360 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
16370 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
16380 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
16390 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
163a0 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
163b0 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
163c0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
163d0 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
163e0 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
163f0 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
16400 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
16410 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
16420 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
16430 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
16440 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
16450 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
16460 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
16470 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
16480 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
16490 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
164a0 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
164b0 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
164c0 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
164d0 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
164e0 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
164f0 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
16500 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
16510 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
16520 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
16530 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
16540 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
16550 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
16560 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
16570 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
16580 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
16590 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
165a0 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
165b0 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
165c0 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
165d0 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
165e0 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
165f0 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
16600 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
16610 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
16620 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
16630 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
16640 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
16650 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
16660 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
16670 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
16680 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
16690 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
166a0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
166b0 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
166c0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
166d0 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
166e0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
166f0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
16700 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
16710 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
16720 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
16730 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
16740 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
16750 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
16760 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65  #306.  Strengthe
16770 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
16780 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
16790 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
167a0 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a  s not DISTINCT..
167b0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
167c0 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
167d0 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
167e0 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
167f0 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
16800 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
16810 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
16820 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
16830 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
16840 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
16850 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
16860 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
16870 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
16880 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
16890 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ueries..**.**   
168a0 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
168b0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
168c0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
168d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
168e0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
168f0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
16900 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
16910 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
16920 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  use..**.**   (8)
16930 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
16940 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
16950 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
16960 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
16970 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
16980 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
16990 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
169a0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
169b0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
169c0 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
169d0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  gates..**.**  (1
169e0 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  0)  The subquery
169f0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
16a00 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
16a10 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
16a20 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
16a30 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
16a40 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
16a50 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
16a60 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
16a70 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
16a80 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
16a90 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c    (**)  Not impl
16aa0 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
16ab0 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
16ac0 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
16ad0 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
16ae0 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
16af0 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
16b00 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
16b10 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
16b20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
16b30 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  nd outer query d
16b40 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  o not both use L
16b50 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34  IMIT..**.**  (14
16b60 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16b70 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46  does not use OFF
16b80 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  SET..**.**  (15)
16b90 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
16ba0 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  y is not part of
16bb0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
16bc0 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  ct or the.**    
16bd0 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65      subquery doe
16be0 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d  s not have a LIM
16bf0 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20  IT clause..**   
16c00 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
16c10 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
16c20 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
16c30 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68  .**.**  (16)  Th
16c40 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
16c50 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
16c60 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72  e or the subquer
16c70 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20  y does.**       
16c80 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44   not contain ORD
16c90 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
16ca0 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
16cb0 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
16cc0 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
16cd0 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
16ce0 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
16cf0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
16d00 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75  **  (17)  The su
16d10 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
16d20 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
16d30 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49  , or it is a UNI
16d40 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20  ON ALL .**      
16d50 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73    compound claus
16d60 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65  e made up entire
16d70 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67  ly of non-aggreg
16d80 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64  ate queries, and
16d90 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20   .**        the 
16da0 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a  parent query:.**
16db0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
16dc0 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72  s not itself par
16dd0 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
16de0 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20  select,.**      
16df0 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20      * is not an 
16e00 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53  aggregate or DIS
16e10 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64  TINCT query, and
16e20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68  .**          * h
16e30 61 73 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c  as no other tabl
16e40 65 73 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  es or sub-select
16e50 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
16e60 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ause..**.**     
16e70 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e     The parent an
16e80 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20  d sub-query may 
16e90 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c  contain WHERE cl
16ea0 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74  auses. Subject t
16eb0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65  o.**        rule
16ec0 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64  s (11), (13) and
16ed0 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20   (14), they may 
16ee0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44  also contain ORD
16ef0 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20  ER BY,.**       
16f00 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
16f10 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
16f20 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
16f30 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
16f40 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
16f50 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
16f60 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
16f70 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f  RDER by clause o
16f80 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
16f90 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
16fa0 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
16fb0 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
16fc0 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
16fd0 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20  *.**  (19)  The 
16fe0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
16ff0 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
17000 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
17010 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
17020 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63    have a WHERE c
17030 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  lause..**.**  (2
17040 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  0)  If the sub-q
17050 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
17060 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
17070 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a  it must not use.
17080 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44  **        an ORD
17090 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ER BY clause.  T
170a0 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65  icket #3773.  We
170b0 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69   could relax thi
170c0 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  s constraint.** 
170d0 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20         somewhat 
170e0 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74  by saying that t
170f0 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
17100 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17110 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61  must.**        a
17120 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66  ppear as unmodif
17130 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ied result colum
17140 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ns in the outer 
17150 71 75 65 72 79 2e 20 20 42 75 74 0a 2a 2a 20 20  query.  But.**  
17160 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72        have other
17170 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
17180 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77  n mind to deal w
17190 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a  ith that case..*
171a0 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20  *.**  (21)  The 
171b0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
171c0 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
171d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
171e0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
171f0 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20  DISTINCT.  (See 
17200 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36  ticket [752e1646
17210 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  fc])..**.** In t
17220 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
17230 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
17240 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
17250 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
17260 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
17270 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
17280 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
17290 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
172a0 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
172b0 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
172c0 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
172d0 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
172e0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
172f0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
17300 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
17310 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
17320 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
17330 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
17340 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
17350 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
17360 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
17370 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
17380 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
17390 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
173a0 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
173b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
173c0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
173d0 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
173e0 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
173f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
17400 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
17410 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
17420 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
17430 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
17440 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
17450 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
17460 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
17470 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
17480 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
17490 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
174a0 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
174b0 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
174c0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
174d0 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
174e0 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
174f0 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
17500 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
17510 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
17520 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
17530 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
17540 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
17550 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
17560 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
17570 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
17580 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
17590 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
175a0 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65  *pParent;.  Sele
175b0 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
175c0 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
175d0 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
175e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
175f0 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  ub1;      /* Poi
17600 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
17610 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20  tmost select in 
17620 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53  sub-query */.  S
17630 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
17640 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
17650 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
17660 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
17670 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
17680 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
17690 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
176a0 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
176b0 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
176c0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
176d0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
176e0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
176f0 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
17700 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
17710 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
17720 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
17730 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17750 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
17760 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17780 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
17790 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
177a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
177b0 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
177c0 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
177d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
177e0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
177f0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
17800 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
17810 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
17820 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
17830 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
17840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
17850 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f  >pPrior==0 );  /
17860 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74  * Unable to flat
17870 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  ten compound que
17880 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  ries */.  if( db
17890 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
178a0 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 20  _QueryFlattener 
178b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
178c0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
178d0 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20  assert( pSrc && 
178e0 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f  iFrom>=0 && iFro
178f0 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  m<pSrc->nSrc );.
17900 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53    pSubitem = &pS
17910 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20  rc->a[iFrom];.  
17920 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74  iParent = pSubit
17930 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
17940 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Sub = pSubitem->
17950 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
17960 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
17970 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
17980 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
17990 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
179a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
179b0 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20  ction (1)  */.  
179c0 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
179d0 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e  g && pSrc->nSrc>
179e0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
179f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
17a00 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20  ction (2)  */.  
17a10 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
17a20 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
17a30 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
17a40 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
17a50 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
17a60 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
17a70 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
17a80 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
17a90 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
17aa0 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c  resssions, we al
17ab0 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69  lowed some combi
17ac0 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e  ning of LIMIT an
17ad0 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
17ae0 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64  cause they could
17af0 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20   be computed at 
17b00 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42  compile-time.  B
17b10 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  ut when LIMIT an
17b20 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
17b30 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65  came arbitrary e
17b40 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77  xpressions, we w
17b50 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64  ere forced to ad
17b60 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  d restrictions (
17b70 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34  13).  ** and (14
17b80 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ). */.  if( pSub
17b90 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
17ba0 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
17bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17bc0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
17bd0 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  3) */.  if( pSub
17be0 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75  ->pOffset ) retu
17bf0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17c10 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
17c20 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  4) */.  if( p->p
17c30 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75  Rightmost && pSu
17c40 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
17c50 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c80 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
17c90 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
17ca0 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
17cb0 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
17cc0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
17ce0 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
17cf0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
17d00 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
17d10 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
17d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
17d30 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f  triction (5)  */
17d40 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
17d50 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  mit && (pSrc->nS
17d60 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
17d70 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
17d80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
17d90 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20  rictions (8)(9) 
17da0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
17db0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
17dc0 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73  istinct)!=0 && s
17dd0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
17de0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
17df0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
17e00 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20  ction (6)  */.  
17e10 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
17e20 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
17e30 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65  derBy ){.     re
17e40 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e70 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
17e80 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (11) */.  }.  i
17e90 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62  f( isAgg && pSub
17ea0 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
17eb0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
17ec0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
17ed0 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69  tion (16) */.  i
17ee0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
17ef0 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  && p->pWhere ) r
17f00 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
17f10 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
17f20 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69  tion (19) */.  i
17f30 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
17f40 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
17f50 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
17f60 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  0 ){.     return
17f70 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
17f80 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20  estriction (21) 
17f90 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53  */.  }..  /* OBS
17fa0 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a  OLETE COMMENT 1:
17fb0 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
17fc0 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
17fd0 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
17fe0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
17ff0 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
18000 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
18010 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
18020 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
18030 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
18040 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
18050 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
18060 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
18070 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
18080 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
18090 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
180a0 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
180b0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
180c0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
180d0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
180e0 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
180f0 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
18100 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
18110 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
18120 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45  **.  ** OBSOLETE
18130 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a   COMMENT 2:.  **
18140 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
18150 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
18160 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
18170 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
18180 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
18190 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
181a0 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
181b0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
181c0 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
181d0 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
181e0 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
181f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
18200 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
18210 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
18220 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
18230 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
18240 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
18250 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
18260 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
18270 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
18280 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
18290 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
182a0 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
182b0 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
182c0 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
182d0 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
182e0 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
182f0 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
18300 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
18310 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
18320 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45  **.  ** THIS OVE
18330 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20  RRIDES OBSOLETE 
18340 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32  COMMENTS 1 AND 2
18350 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63   ABOVE:.  ** Tic
18360 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20  ket #3300 shows 
18370 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20  that flattening 
18380 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
18390 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20  f a LEFT JOIN.  
183a0 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69  ** is fraught wi
183b0 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74  th danger.  Best
183c0 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68   to avoid the wh
183d0 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74  ole thing.  If t
183e0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
183f0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
18400 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
18410 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  N, then do not f
18420 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  latten..  */.  i
18430 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  f( (pSubitem->jo
18440 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
18450 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)!=0 ){.    ret
18460 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
18470 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
18480 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
18490 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
184a0 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
184b0 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
184c0 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
184d0 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
184e0 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
184f0 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
18500 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
18510 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
18520 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
18530 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
18540 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
18550 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
18560 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
18570 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
18580 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
18590 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
185a0 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
185b0 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  n 20 */.    }.  
185c0 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
185d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
185e0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
185f0 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
18600 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
18610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
18620 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
18630 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
18640 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
18650 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
18660 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
18670 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
18680 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
18690 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
186a0 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
186b0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
186c0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
186d0 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
186e0 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 69 66  gate );.      if
186f0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
18700 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
18710 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
18720 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  !=0.       || (p
18730 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
18740 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
18750 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 4e 45  L) .       || NE
18760 56 45 52 28 70 53 75 62 31 2d 3e 70 53 72 63 3d  VER(pSub1->pSrc=
18770 3d 30 29 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53  =0) || pSub1->pS
18780 72 63 2d 3e 6e 53 72 63 21 3d 31 0a 20 20 20 20  rc->nSrc!=1.    
18790 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
187a0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
187b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
187c0 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a  triction 18. */.
187d0 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
187e0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
187f0 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
18800 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
18810 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
18820 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
18830 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
18840 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  ].iCol==0 ) retu
18850 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
18860 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a    }.  }..  /****
18870 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
18880 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65  is point, flatte
18890 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
188a0 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20  d. *****/..  /* 
188b0 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75  Authorize the su
188c0 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72  bquery */.  pPar
188d0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
188e0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61   = pSubitem->zNa
188f0 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74  me;.  sqlite3Aut
18900 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
18910 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
18920 20 30 2c 20 30 29 3b 0a 20 20 70 50 61 72 73 65   0, 0);.  pParse
18930 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
18940 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
18950 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  xt;..  /* If the
18960 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
18970 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
18980 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
18990 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73  (by restrictions
189a0 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20  .  ** 17 and 18 
189b0 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62  above) it must b
189c0 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e  e a UNION ALL an
189d0 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  d the parent que
189e0 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65  ry must .  ** be
189f0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
18a00 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
18a10 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46  CT <expr-list> F
18a20 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e  ROM (<sub-query>
18a30 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e  ) <where-clause>
18a40 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c   .  **.  ** foll
18a50 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45  owed by any ORDE
18a60 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f  R BY, LIMIT and/
18a70 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  or OFFSET clause
18a80 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20  s. This block.  
18a90 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63  ** creates N-1 c
18aa0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
18ab0 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75  ent query withou
18ac0 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  t any ORDER BY, 
18ad0 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f  LIMIT or .  ** O
18ae0 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e  FFSET clauses an
18af0 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20  d joins them to 
18b00 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69  the left-hand-si
18b10 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  de of the origin
18b20 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e  al.  ** using UN
18b30 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
18b40 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
18b50 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
18b60 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73  of simple.  ** s
18b70 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
18b80 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   in the compound
18b90 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a   sub-query..  **
18ba0 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20  .  ** Example:. 
18bb0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
18bc0 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20  ECT a+1 FROM (. 
18bd0 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
18be0 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T x FROM tab.  *
18bf0 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
18c00 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
18c10 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62  ELECT y FROM tab
18c20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
18c30 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
18c40 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
18c50 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a  2) FROM tab2.  *
18c60 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21  *     ) WHERE a!
18c70 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  =5 ORDER BY 1.  
18c80 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72  **.  ** Transfor
18c90 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20  med into:.  **. 
18ca0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
18cb0 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
18cc0 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E x+1!=5.  **   
18cd0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
18ce0 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20       SELECT y+1 
18cf0 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79  FROM tab WHERE y
18d00 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
18d10 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
18d20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
18d30 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48  )+1 FROM tab2 WH
18d40 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d  ERE abs(z*2)+1!=
18d50 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52  5.  **     ORDER
18d60 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
18d70 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65  We call this the
18d80 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75   "compound-subqu
18d90 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e  ery flattening".
18da0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62  .  */.  for(pSub
18db0 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70  =pSub->pPrior; p
18dc0 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e  Sub; pSub=pSub->
18dd0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c  pPrior){.    Sel
18de0 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45  ect *pNew;.    E
18df0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
18e00 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
18e10 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  .    Expr *pLimi
18e20 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
18e30 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
18e40 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
18e50 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
18e60 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20   0;.    p->pSrc 
18e70 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  = 0;.    p->pPri
18e80 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  or = 0;.    p->p
18e90 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70  Limit = 0;.    p
18ea0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  New = sqlite3Sel
18eb0 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29  ectDup(db, p, 0)
18ec0 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
18ed0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d  = pLimit;.    p-
18ee0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
18ef0 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72  erBy;.    p->pSr
18f00 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d  c = pSrc;.    p-
18f10 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20  >op = TK_ALL;.  
18f20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20    p->pRightmost 
18f30 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  = 0;.    if( pNe
18f40 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  w==0 ){.      pN
18f50 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  ew = pPrior;.   
18f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
18f70 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
18f80 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ior;.      pNew-
18f90 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
18fa0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50  .    }.    p->pP
18fb0 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
18fc0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
18fd0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
18fe0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
18ff0 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
19000 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
19010 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
19020 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
19030 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
19040 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
19050 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
19060 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
19070 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
19080 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
19090 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
190a0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
190b0 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
190c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
190d0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
190e0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
190f0 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
19100 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
19110 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
19120 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
19130 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
19140 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
19150 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
19160 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
19170 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
19180 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
19190 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
191a0 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
191b0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
191c0 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
191d0 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
191e0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
191f0 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
19200 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
19210 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
19220 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
19230 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
19240 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
19250 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
19260 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
19270 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3346..  **.  ** 
19280 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69  pSubitem->pTab i
19290 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c  s always non-NUL
192a0 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69  L by test restri
192b0 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73  ctions and tests
192c0 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69   above..  */.  i
192d0 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74  f( ALWAYS(pSubit
192e0 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  em->pTab!=0) ){.
192f0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
19300 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d  oDel = pSubitem-
19310 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
19320 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d  TabToDel->nRef==
19330 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
19340 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
19350 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
19360 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
19370 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
19380 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
19390 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
193a0 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
193b0 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
193c0 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
193d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
193e0 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  ToDel->nRef--;. 
193f0 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65     }.    pSubite
19400 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d  m->pTab = 0;.  }
19410 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
19420 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  wing loop runs o
19430 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72  nce for each ter
19440 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  m in a compound-
19450 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c  subquery.  ** fl
19460 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73  attening (as des
19470 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20  cribed above).  
19480 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
19490 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64  a different kind
194a0 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e  .  ** of flatten
194b0 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69  ing - a flatteni
194c0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
194d0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
194e0 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20  y flattening -. 
194f0 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f   ** then this lo
19500 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63  op only runs onc
19510 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
19520 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c  s loop moves all
19530 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
19540 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
19550 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
19560 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
19570 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
19580 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
19590 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
195a0 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
195b0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
195c0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
195d0 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
195e0 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
195f0 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
19600 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
19610 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
19620 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
19630 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
19640 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
19650 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
19660 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
19670 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
19680 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
19690 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
196a0 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
196b0 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
196c0 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
196d0 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
196e0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  in..  */.  for(p
196f0 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e  Parent=p; pParen
19700 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65  t; pParent=pPare
19710 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62  nt->pPrior, pSub
19720 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
19730 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b      int nSubSrc;
19740 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65  .    u8 jointype
19750 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72   = 0;.    pSubSr
19760 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20  c = pSub->pSrc; 
19770 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
19780 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a  se of subquery *
19790 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20  /.    nSubSrc = 
197a0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20  pSubSrc->nSrc;  
197b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
197c0 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46  ms in subquery F
197d0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
197e0 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
197f0 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
19800 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
19810 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
19820 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29  ..    if( pSrc )
19830 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19840 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f  pParent==p );  /
19850 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72  * First time thr
19860 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
19870 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
19880 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e  = pSubitem->join
19890 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
198a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
198b0 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a  Parent!=p );  /*
198c0 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
198d0 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67  ent times throug
198e0 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
198f0 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
19900 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  nt->pSrc = sqlit
19910 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
19920 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
19930 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
19940 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
19950 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
19960 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62  led );.        b
19970 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19980 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
19990 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
199a0 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
199b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
199c0 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
199d0 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
199e0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
199f0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
19a00 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
19a10 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
19a20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
19a30 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
19a40 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
19a50 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
19a60 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
19a70 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
19a80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
19a90 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
19aa0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
19ab0 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
19ac0 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
19ad0 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
19ae0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
19af0 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
19b00 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
19b10 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
19b20 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
19b30 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
19b40 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
19b50 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
19b60 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
19b70 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
19b80 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
19b90 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65 72  and the out quer
19ba0 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54  y to 4 slots.  T
19bb0 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a  he middle.    **
19bc0 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
19bd0 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
19be0 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
19bf0 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20  space for the.  
19c00 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74    ** two element
19c10 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
19c20 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
19c30 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
19c40 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
19c50 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
19c60 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73  >pSrc = pSrc = s
19c70 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
19c80 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e  arge(db, pSrc, n
19c90 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
19ca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
19cb0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
19cc0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
19cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
19ce0 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74     /* Transfer t
19cf0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
19d00 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75  erms from the su
19d10 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
19d20 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
19d30 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ry..    */.    f
19d40 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
19d50 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
19d60 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
19d70 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69  te(db, pSrc->a[i
19d80 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b  +iFrom].pUsing);
19d90 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
19da0 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
19db0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d  c->a[i];.      m
19dc0 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
19dd0 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
19de0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
19df0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
19e00 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79  >a[iFrom].jointy
19e10 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20  pe = jointype;. 
19e20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67   .    /* Now beg
19e30 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  in substituting 
19e40 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20  subquery result 
19e50 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
19e60 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65  for .    ** refe
19e70 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
19e80 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
19e90 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  er query..    **
19ea0 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65   .    ** Example
19eb0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
19ec0 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
19ed0 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
19ee0 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
19ef0 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
19f00 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20  RE a>b;.    **  
19f10 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
19f20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
19f30 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
19f40 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
19f50 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20      /.    **    
19f60 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
19f70 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
19f80 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
19f90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
19fa0 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  _/.    **.    **
19fb0 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
19fc0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
19fd0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
19fe0 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
19ff0 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61  we see.    ** "a
1a000 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
1a010 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
1a020 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
1a030 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
1a040 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  y+10"..    */.  
1a050 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e    pList = pParen
1a060 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
1a070 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1a080 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1a090 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
1a0a0 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  [i].zName==0 ){.
1a0b0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1a0c0 61 72 20 2a 7a 53 70 61 6e 20 3d 20 70 4c 69 73  ar *zSpan = pLis
1a0d0 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
1a0e0 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59         if( ALWAY
1a0f0 53 28 7a 53 70 61 6e 29 20 29 7b 0a 20 20 20 20  S(zSpan) ){.    
1a100 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
1a110 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
1a120 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 53  3DbStrDup(db, zS
1a130 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pan);.        }.
1a140 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a150 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1a160 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  db, pParent->pEL
1a170 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ist, iParent, pS
1a180 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1a190 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
1a1a0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1a1b0 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
1a1c0 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
1a1d0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1a1e0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1a1f0 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1a200 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
1a210 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
1a220 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1a230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a240 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1a250 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1a260 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1a270 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
1a280 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
1a290 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
1a2a0 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f  ;.      pSub->pO
1a2b0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1a2c0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e  }else if( pParen
1a2d0 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
1a2e0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1a2f0 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1a300 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e  pOrderBy, iParen
1a310 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1a320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a330 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a  pSub->pWhere ){.
1a340 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 73        pWhere = s
1a350 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1a360 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20  , pSub->pWhere, 
1a370 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1a380 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b       pWhere = 0;
1a390 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
1a3a0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1a3b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1a3c0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d  arent->pHaving==
1a3d0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
1a3e0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50  nt->pHaving = pP
1a3f0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20  arent->pWhere;. 
1a400 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1a410 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
1a420 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
1a430 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1a440 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1a450 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
1a460 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1a470 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1a480 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
1a490 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
1a4a0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20  ent->pHaving, . 
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1a4e0 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
1a4f0 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73  g, 0));.      as
1a500 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1a510 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
1a520 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
1a530 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
1a540 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
1a550 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30  Sub->pGroupBy, 0
1a560 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1a570 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1a580 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
1a590 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
1a5a0 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ere, iParent, pS
1a5b0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1a5c0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
1a5d0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
1a5e0 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
1a5f0 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
1a600 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1a610 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
1a620 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
1a630 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
1a640 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
1a650 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
1a660 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
1a670 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74    */.    pParent
1a680 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53  ->selFlags |= pS
1a690 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1a6a0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20  F_Distinct;.  . 
1a6b0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c     /*.    ** SEL
1a6c0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
1a6d0 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
1a6e0 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
1a6f0 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20   x OFFSET y;.   
1a700 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69   **.    ** One i
1a710 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79  s tempted to try
1a720 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20   to add a and b 
1a730 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  to combine the l
1a740 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73  imits.  But this
1a750 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
1a760 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
1a770 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
1a780 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1a790 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
1a7a0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
1a7b0 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
1a7c0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53  pLimit;.      pS
1a7d0 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ub->pLimit = 0;.
1a7e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1a7f0 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
1a800 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
1a810 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
1a820 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
1a830 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
1a840 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1a850 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20  e(db, pSub1);.. 
1a860 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
1a870 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1a880 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1a890 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1a8a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1a8b0 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  EW) */../*.** An
1a8c0 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54  alyze the SELECT
1a8d0 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
1a8e0 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
1a8f0 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a   to see if it.**
1a900 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   is a min() or m
1a910 61 78 28 29 20 71 75 65 72 79 2e 20 52 65 74 75  ax() query. Retu
1a920 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
1a930 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
1a940 44 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a  DERBY_MAX if .**
1a950 20 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68   it is, or 0 oth
1a960 65 72 77 69 73 65 2e 20 41 74 20 70 72 65 73 65  erwise. At prese
1a970 6e 74 2c 20 61 20 71 75 65 72 79 20 69 73 20 63  nt, a query is c
1a980 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a  onsidered to be.
1a990 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29  ** a min()/max()
1a9a0 20 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a   query if:.**.**
1a9b0 20 20 20 31 2e 20 54 68 65 72 65 20 69 73 20 61     1. There is a
1a9c0 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69   single object i
1a9d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1a9e0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68  e..**.**   2. Th
1a9f0 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ere is a single 
1aa00 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
1aa10 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e  e result set, an
1aa20 64 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20  d it is.**      
1aa30 65 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72  either min(x) or
1aa40 20 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20 78   max(x), where x
1aa50 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66   is a column ref
1aa60 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erence..*/.stati
1aa70 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79  c u8 minMaxQuery
1aa80 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45  (Select *p){.  E
1aa90 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78  xpr *pExpr;.  Ex
1aaa0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
1aab0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69   p->pEList;..  i
1aac0 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
1aad0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 57 48 45  !=1 ) return WHE
1aae0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
1aaf0 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c  L;.  pExpr = pEL
1ab00 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
1ab10 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
1ab20 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
1ab30 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
1ab40 69 66 28 20 4e 45 56 45 52 28 45 78 70 72 48 61  if( NEVER(ExprHa
1ab50 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1ab60 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20   EP_xIsSelect)) 
1ab70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45  ) return 0;.  pE
1ab80 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
1ab90 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  pList;.  if( pEL
1aba0 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  ist==0 || pEList
1abb0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
1abc0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 4c  urn 0;.  if( pEL
1abd0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
1abe0 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
1abf0 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48 45 52  MN ) return WHER
1ac00 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1ac10 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
1ac20 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ac30 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1ac40 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
1ac50 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
1ac60 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 69 6e 22 29 3d  u.zToken,"min")=
1ac70 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1ac80 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1ac90 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
1aca0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1acb0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
1acc0 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
1acd0 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
1ace0 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20  ERBY_MAX;.  }.  
1acf0 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
1ad00 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a  ERBY_NORMAL;.}..
1ad10 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
1ad20 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
1ad30 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1ad40 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
1ad50 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
1ad60 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
1ad70 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
1ad80 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
1ad90 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
1ada0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
1adb0 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
1adc0 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
1add0 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
1ade0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1adf0 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
1ae00 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
1ae10 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
1ae20 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
1ae30 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
1ae40 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
1ae50 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
1ae60 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
1ae70 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
1ae80 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
1ae90 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
1aea0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1aeb0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
1aec0 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
1aed0 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
1aee0 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
1aef0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1af00 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1af10 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
1af20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
1af30 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
1af40 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
1af50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
1af60 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
1af70 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
1af80 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
1af90 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
1afa0 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
1afb0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
1afc0 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
1afd0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1afe0 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
1aff0 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
1b000 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
1b010 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
1b020 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
1b030 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
1b040 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
1b050 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
1b060 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e  0;.  if( (pAggIn
1b070 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75  fo->aFunc[0].pFu
1b080 6e 63 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  nc->flags&SQLITE
1b090 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20  _FUNC_COUNT)==0 
1b0a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1b0b0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45  ( pExpr->flags&E
1b0c0 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  P_Distinct ) ret
1b0d0 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  urn 0;..  return
1b0e0 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
1b0f0 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  If the source-li
1b100 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61  st item passed a
1b110 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61  s an argument wa
1b120 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
1b130 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42   an.** INDEXED B
1b140 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
1b150 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ry to locate the
1b160 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78   specified index
1b170 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61  . If there.** wa
1b180 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20  s such a clause 
1b190 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  and the named in
1b1a0 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  dex cannot be fo
1b1b0 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  und, return .** 
1b1c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64  SQLITE_ERROR and
1b1d0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
1b1e0 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72  in pParse. Other
1b1f0 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a  wise, populate .
1b200 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78  ** pFrom->pIndex
1b210 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1b220 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
1b230 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
1b240 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  okup(Parse *pPar
1b250 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
1b260 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
1b270 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54  .  if( pFrom->pT
1b280 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e  ab && pFrom->zIn
1b290 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  dex ){.    Table
1b2a0 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
1b2b0 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a  pTab;.    char *
1b2c0 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e  zIndex = pFrom->
1b2d0 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65  zIndex;.    Inde
1b2e0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
1b2f0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
1b300 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  ex; .        pId
1b310 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  x && sqlite3StrI
1b320 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  Cmp(pIdx->zName,
1b330 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20   zIndex); .     
1b340 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
1b350 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
1b360 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
1b370 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1b380 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1b390 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
1b3a0 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20  Index, 0);.     
1b3b0 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
1b3c0 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
1b3d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1b3e0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
1b3f0 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70  From->pIndex = p
1b400 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Idx;.  }.  retur
1b410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b420 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1b430 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63  ne is a Walker c
1b440 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70  allback for "exp
1b450 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54  anding" a SELECT
1b460 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22   statement..** "
1b470 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73  Expanding" means
1b480 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f   to do the follo
1b490 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  wing:.**.**    (
1b4a0 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
1b4b0 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
1b4c0 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
1b4d0 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
1b4e0 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
1b4f0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1b500 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
1b510 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
1b520 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
1b530 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
1b540 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
1b550 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
1b560 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
1b570 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
1b580 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1b590 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
1b5a0 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
1b5b0 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
1b5c0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
1b5d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
1b5e0 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
1b5f0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
1b600 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
1b610 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
1b620 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
1b630 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
1b640 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
1b650 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
1b660 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
1b670 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
1b680 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
1b690 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
1b6a0 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
1b6b0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
1b6c0 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
1b6d0 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
1b6e0 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
1b6f0 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
1b700 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
1b710 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
1b720 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
1b730 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
1b740 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1b750 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
1b760 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
1b770 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
1b780 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
1b790 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
1b7a0 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
1b7b0 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
1b7c0 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
1b7d0 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
1b7e0 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
1b7f0 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
1b800 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
1b810 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
1b820 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
1b830 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
1b840 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
1b850 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
1b860 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a  in TABLE..**.*/.
1b870 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
1b880 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72  tExpander(Walker
1b890 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
1b8a0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
1b8b0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
1b8c0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
1b8d0 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69  i, j, k;.  SrcLi
1b8e0 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
1b8f0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1b900 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1b910 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
1b920 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1b930 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
1b940 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1b950 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
1b960 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1b970 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  }.  if( NEVER(p-
1b980 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 70 2d  >pSrc==0) || (p-
1b990 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  >selFlags & SF_E
1b9a0 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20  xpanded)!=0 ){. 
1b9b0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1b9c0 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 65  une;.  }.  p->se
1b9d0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
1b9e0 61 6e 64 65 64 3b 0a 20 20 70 54 61 62 4c 69 73  anded;.  pTabLis
1b9f0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
1ba00 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
1ba10 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  t;..  /* Make su
1ba20 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
1ba30 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
1ba40 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
1ba50 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
1ba60 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1ba70 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1ba80 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
1ba90 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1baa0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
1bab0 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a  pTabList);..  /*
1bac0 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
1bad0 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
1bae0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1baf0 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
1bb00 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
1bb10 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1bb20 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
1bb30 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
1bb40 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
1bb50 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
1bb60 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
1bb70 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
1bb80 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
1bb90 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
1bba0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
1bbb0 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
1bbc0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
1bbd0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
1bbe0 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20   *pTab;.    if( 
1bbf0 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
1bc00 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1bc10 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c  statement has al
1bc20 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61  ready been prepa
1bc30 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e  red.  There is n
1bc40 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20  o need.      ** 
1bc50 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a  to go further. *
1bc60 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1bc70 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65  i==0 );.      re
1bc80 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
1bc90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
1bca0 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  rom->zName==0 ){
1bcb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bcc0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1bcd0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
1bce0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
1bcf0 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  t;.      /* A su
1bd00 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
1bd10 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
1bd20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
1bd30 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20  assert( pSel!=0 
1bd40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1bd50 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
1bd60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bd70 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
1bd80 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  er, pSel);.     
1bd90 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
1bda0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
1bdb0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1bdc0 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
1bdd0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
1bde0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
1bdf0 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  rt;.      pTab->
1be00 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
1be10 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
1be20 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1be30 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72   "sqlite_subquer
1be40 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70  y_%p_", (void*)p
1be50 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  Tab);.      whil
1be60 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
1be70 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e  ){ pSel = pSel->
1be80 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20  pPrior; }.      
1be90 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
1bea0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1beb0 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20  , pSel->pEList, 
1bec0 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
1bed0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  ab->aCol);.     
1bee0 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
1bef0 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  1;.      pTab->n
1bf00 52 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30 30  RowEst = 1000000
1bf10 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  ;.      pTab->ta
1bf20 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
1bf30 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20  emeral;.#endif. 
1bf40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bf50 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
1bf60 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
1bf70 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
1bf80 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
1bf90 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
1bfa0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
1bfb0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
1bfc0 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
1bfd0 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
1bfe0 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a  Parse,0,pFrom->z
1bff0 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74  Name,pFrom->zDat
1c000 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66  abase);.      if
1c010 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
1c020 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1c030 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
1c040 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
1c050 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1c060 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
1c070 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1c080 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
1c090 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
1c0a0 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
1c0b0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
1c0c0 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69   We reach here i
1c0d0 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
1c0e0 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20  e is a really a 
1c0f0 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20  view */.        
1c100 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
1c110 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
1c120 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
1c130 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1c140 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c150 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
1c160 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  0 );.        pFr
1c170 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
1c180 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
1c190 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
1c1a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
1c1b0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1c1c0 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e  pWalker, pFrom->
1c1d0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
1c1e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
1c1f0 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68      /* Locate th
1c200 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79  e index named by
1c210 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
1c220 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20  clause, if any. 
1c230 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
1c240 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
1c250 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  p(pParse, pFrom)
1c260 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c270 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1c280 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
1c290 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
1c2a0 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
1c2b0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
1c2c0 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
1c2d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1c2e0 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72  iled || sqlitePr
1c2f0 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
1c300 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , p) ){.    retu
1c310 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1c320 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  }..  /* For ever
1c330 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
1c340 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
1c350 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
1c360 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
1c370 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
1c380 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
1c390 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
1c3a0 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
1c3b0 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
1c3c0 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
1c3d0 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
1c3e0 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
1c3f0 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
1c400 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f  ith the TK_ALL o
1c410 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
1c420 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
1c430 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
1c440 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20   list..  ** The 
1c450 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
1c460 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
1c470 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70  e the TK_ALL exp
1c480 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
1c490 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e  and.  ** each on
1c4a0 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
1c4b0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
1c4c0 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
1c4d0 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
1c4e0 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
1c4f0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
1c500 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
1c510 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
1c520 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
1c530 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
1c540 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
1c550 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; k++){.    Expr
1c560 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pE = pEList->a
1c570 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
1c580 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  f( pE->op==TK_AL
1c590 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61  L ) break;.    a
1c5a0 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
1c5b0 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
1c5c0 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ght!=0 );.    as
1c5d0 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
1c5e0 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65  _DOT || (pE->pLe
1c5f0 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65  ft!=0 && pE->pLe
1c600 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29  ft->op==TK_ID) )
1c610 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
1c620 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
1c630 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41  pRight->op==TK_A
1c640 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  LL ) break;.  }.
1c650 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e    if( k<pEList->
1c660 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a  nExpr ){.    /*.
1c670 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74      ** If we get
1c680 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74   here it means t
1c690 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  he result set co
1c6a0 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
1c6b0 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70  re "*".    ** op
1c6c0 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65  erators that nee
1c6d0 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
1c6e0 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  .  Loop through 
1c6f0 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a  each expression.
1c700 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
1c710 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70  sult set and exp
1c720 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20  and them one by 
1c730 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
1c740 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1c750 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74  item *a = pEList
1c760 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ->a;.    ExprLis
1c770 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  t *pNew = 0;.   
1c780 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61   int flags = pPa
1c790 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a  rse->db->flags;.
1c7a0 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65      int longName
1c7b0 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  s = (flags & SQL
1c7c0 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
1c7d0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
1c7e0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66             && (f
1c7f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
1c800 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b  ortColNames)==0;
1c810 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ..    for(k=0; k
1c820 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
1c830 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  k++){.      Expr
1c840 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70   *pE = a[k].pExp
1c850 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1c860 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
1c870 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30  || pE->pRight!=0
1c880 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
1c890 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20  ->op!=TK_ALL && 
1c8a0 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
1c8b0 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
1c8c0 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
1c8d0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
1c8e0 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
1c8f0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
1c900 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
1c910 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1c920 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
1c930 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1c940 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
1c950 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
1c960 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
1c970 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1c980 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
1c990 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
1c9a0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
1c9b0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
1c9c0 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
1c9d0 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
1c9e0 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
1c9f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
1ca00 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
1ca10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ca20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
1ca30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ca40 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
1ca50 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
1ca60 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
1ca70 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
1ca80 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
1ca90 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
1caa0 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
1cab0 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
1cac0 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
1cad0 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
1cae0 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b     char *zTName;
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
1cb00 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
1cb10 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
1cb20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
1cb30 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OT ){.          
1cb40 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66  assert( pE->pLef
1cb50 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
1cb60 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1cb70 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70  asProperty(pE->p
1cb80 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Left, EP_IntValu
1cb90 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
1cba0 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65  zTName = pE->pLe
1cbb0 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
1cbc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cbd0 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
1cbe0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1cbf0 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
1cc00 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1cc10 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1cc20 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1cc30 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
1cc40 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
1cc50 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
1cc60 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
1cc70 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
1cc80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
1cc90 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TabName==0 ){.  
1cca0 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
1ccb0 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
1ccc0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ccd0 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
1cce0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
1ccf0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1cd00 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
1cd10 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
1cd20 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
1cd30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1cd40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1cd50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1cd60 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
1cd70 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
1cd80 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
1cd90 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1cda0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20     Expr *pExpr, 
1cdb0 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  *pRight;.       
1cdc0 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
1cdd0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
1cde0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
1cdf0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61      char *zColna
1ce00 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  me;  /* The comp
1ce10 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
1ce20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1ce30 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20  char *zToFree;  
1ce40 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72   /* Malloced str
1ce50 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74  ing that needs t
1ce60 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1ce70 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20            Token 
1ce80 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f  sColname;  /* Co
1ce90 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
1cea0 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f  me as a token */
1ceb0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
1cec0 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20   If a column is 
1ced0 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65  marked as 'hidde
1cee0 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e  n' (currently on
1cef0 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  ly possible.    
1cf00 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76          ** for v
1cf10 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20  irtual tables), 
1cf20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69  do not include i
1cf30 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65  t in the expande
1cf40 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
1cf50 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
1cf60 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
1cf70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1cf80 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28   IsHiddenColumn(
1cf90 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20  &pTab->aCol[j]) 
1cfa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1cfb0 20 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61   assert(IsVirtua
1cfc0 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20  l(pTab));.      
1cfd0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1cfe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1cff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1d000 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
1d010 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1d020 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a     if( (pFrom->j
1d030 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
1d040 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20  URAL)!=0.       
1d050 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c           && tabl
1d060 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
1d070 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61  pTabList, i, zNa
1d080 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20  me, 0, 0).      
1d090 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1d0a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1d0b0 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
1d0c0 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
1d0d0 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
1d0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d0f0 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65   ** table to the
1d100 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f   right of the jo
1d110 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  in */.          
1d120 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1d150 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
1d160 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69  ndex(pFrom->pUsi
1d170 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
1d180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d190 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
1d1a0 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
1d1b0 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
1d1c0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1d1d0 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
1d1e0 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
1d1f0 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
1d200 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
1d210 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1d220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1d230 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1d240 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
1d250 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
1d260 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65  db, TK_ID, zName
1d270 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
1d280 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  Colname = zName;
1d290 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
1d2a0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
1d2b0 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
1d2c0 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
1d2d0 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
1d2e0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
1d2f0 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
1d300 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
1d310 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
1d320 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  D, zTabName);.  
1d330 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1d340 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
1d350 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
1d360 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
1d370 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1d380 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
1d390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1d3a0 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71     zColname = sq
1d3b0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1d3c0 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61   "%s.%s", zTabNa
1d3d0 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
1d3f0 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  ree = zColname;.
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1d410 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1d420 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1d430 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
1d440 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1d450 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
1d460 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1d470 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1d480 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
1d490 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61            sColna
1d4a0 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  me.z = zColname;
1d4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f  .            sCo
1d4c0 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65  lname.n = sqlite
1d4d0 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61  3Strlen30(zColna
1d4e0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1d4f0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1d500 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
1d510 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c  pNew, &sColname,
1d520 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1d530 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d540 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20  b, zToFree);.   
1d550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d560 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
1d570 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
1d580 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
1d590 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1d5a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d5b0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1d5c0 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
1d5d0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1d5e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d5f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1d600 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1d610 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
1d620 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
1d630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d640 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1d650 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1d660 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
1d670 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
1d680 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  New;.  }.#if SQL
1d690 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
1d6a0 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26   if( p->pEList &
1d6b0 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  & p->pEList->nEx
1d6c0 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
1d6d0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
1d6e0 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
1d6f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d700 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
1d710 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
1d720 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t");.  }.#endif.
1d730 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1d740 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
1d750 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
1d760 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
1d770 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
1d780 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1d790 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
1d7a0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
1d7b0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
1d7c0 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
1d7d0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
1d7e0 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
1d7f0 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
1d800 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
1d810 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1d820 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
1d830 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
1d840 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
1d850 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
1d860 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
1d870 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
1d880 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
1d890 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
1d8a0 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  rser tree..*/.st
1d8b0 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c  atic int exprWal
1d8c0 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
1d8d0 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
1d8e0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
1d8f0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
1d900 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
1d910 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
1d920 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
1d930 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
1d940 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
1d950 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
1d960 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
1d970 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
1d980 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1d990 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
1d9a0 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
1d9b0 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
1d9c0 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
1d9d0 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
1d9e0 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
1d9f0 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
1da00 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
1da10 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
1da20 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
1da30 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
1da40 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
1da50 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
1da60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1da70 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
1da80 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
1da90 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
1daa0 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
1dab0 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
1dac0 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
1dad0 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
1dae0 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
1daf0 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
1db00 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
1db10 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
1db20 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
1db30 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
1db40 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
1db50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
1db60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1db70 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
1db80 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
1db90 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
1dba0 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
1dbb0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
1dbc0 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61  ack = selectExpa
1dbd0 6e 64 65 72 3b 0a 20 20 77 2e 78 45 78 70 72 43  nder;.  w.xExprC
1dbe0 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61  allback = exprWa
1dbf0 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
1dc00 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
1dc10 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
1dc20 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
1dc30 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1dc40 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1dc50 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
1dc60 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
1dc70 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
1dc80 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
1dc90 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
1dca0 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
1dcb0 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
1dcc0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
1dcd0 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
1dce0 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
1dcf0 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
1dd00 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
1dd10 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1dd20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
1dd30 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
1dd40 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
1dd50 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
1dd60 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
1dd70 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
1dd80 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
1dd90 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
1dda0 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
1ddb0 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
1ddc0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
1ddd0 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
1dde0 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
1ddf0 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
1de00 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
1de10 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
1de20 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
1de30 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
1de40 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
1de50 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
1de60 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41 64  tic int selectAd
1de70 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
1de80 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  o(Walker *pWalke
1de90 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
1dea0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
1deb0 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69    int i;.  SrcLi
1dec0 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
1ded0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1dee0 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61  tem *pFrom;..  a
1def0 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
1df00 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
1df10 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   );.  if( (p->se
1df20 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
1df30 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20  ypeInfo)==0 ){. 
1df40 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
1df50 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  = SF_HasTypeInfo
1df60 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20 70  ;.    pParse = p
1df70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
1df80 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
1df90 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28  ->pSrc;.    for(
1dfa0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
1dfb0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
1dfc0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
1dfd0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54  From++){.      T
1dfe0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
1dff0 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
1e000 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 21  if( ALWAYS(pTab!
1e010 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61  =0) && (pTab->ta
1e020 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
1e030 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  meral)!=0 ){.   
1e040 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
1e050 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
1e060 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
1e070 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65  CT */.        Se
1e080 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
1e090 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
1e0a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
1e0b0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  l );.        whi
1e0c0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
1e0d0 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
1e0e0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
1e0f0 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
1e100 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
1e110 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43  pParse, pTab->nC
1e120 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20  ol, pTab->aCol, 
1e130 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSel);.      }. 
1e140 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1e150 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1e160 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
1e170 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
1e180 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20  ds datatype and 
1e190 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1e1a0 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ce information t
1e1b0 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73  o.** the Table s
1e1c0 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c  tructures of all
1e1d0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1e1e0 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20  queries in a.** 
1e1f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1e200 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73  ..**.** Use this
1e210 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e   routine after n
1e220 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ame resolution..
1e230 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1e240 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
1e250 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  ypeInfo(Parse *p
1e260 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
1e270 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66  Select){.#ifndef
1e280 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1e290 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77  QUERY.  Walker w
1e2a0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
1e2b0 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64  lback = selectAd
1e2c0 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
1e2d0 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
1e2e0 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
1e2f0 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
1e300 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
1e310 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
1e320 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64  , pSelect);.#end
1e330 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  if.}.../*.** Thi
1e340 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 6f  s routine sets o
1e350 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
1e360 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
1e370 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c  ing.  The.** fol
1e380 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  lowing is accomp
1e390 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  lished:.**.**   
1e3a0 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72    *  VDBE Cursor
1e3b0 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73   numbers are ass
1e3c0 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f  igned to all FRO
1e3d0 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  M-clause terms..
1e3e0 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65  **     *  Epheme
1e3f0 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
1e400 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
1e410 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
1e420 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  e subqueries..**
1e430 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55       *  ON and U
1e440 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
1e450 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48   shifted into WH
1e460 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ERE statements.*
1e470 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72  *     *  Wildcar
1e480 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c  ds "*" and "TABL
1e490 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73  E.*" in result s
1e4a0 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ets are expanded
1e4b0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e  ..**     *  Iden
1e4c0 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65  tifiers in expre
1e4d0 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65  ssion are matche
1e4e0 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  d to tables..**.
1e4f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e500 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79  acts recursively
1e510 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   on all subqueri
1e520 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45  es within the SE
1e530 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
1e540 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
1e550 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1e560 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
1e570 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1e580 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1e590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e5a0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1e5b0 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
1e5c0 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
1e5d0 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
1e5e0 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
1e5f0 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b   container */.){
1e600 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1e610 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
1e620 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
1e630 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1e640 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
1e650 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
1e660 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
1e670 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
1e680 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
1e690 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1e6a0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1e6b0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
1e6c0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
1e6d0 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73  electNames(pPars
1e6e0 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b  e, p, pOuterNC);
1e6f0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1e700 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
1e710 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1e720 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1e730 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61  tAddTypeInfo(pPa
1e740 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rse, p);.}../*.*
1e750 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
1e760 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1e770 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
1e780 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
1e790 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
1e7a0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
1e7b0 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
1e7c0 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
1e7d0 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
1e7e0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
1e7f0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  his.** routine s
1e800 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c  imply stores NUL
1e810 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
1e820 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e  se memory cells.
1e830 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e840 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
1e850 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e860 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1e870 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1e880 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1e890 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1e8a0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1e8b0 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67  Func;.  if( pAgg
1e8c0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67  Info->nFunc+pAgg
1e8d0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30  Info->nColumn==0
1e8e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1e8f0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1e900 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
1e910 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  mn; i++){.    sq
1e920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e930 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
1e940 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
1e950 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f  .iMem);.  }.  fo
1e960 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
1e970 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
1e980 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1e990 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
1e9a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e9b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1e9c0 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d  , 0, pFunc->iMem
1e9d0 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
1e9e0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
1e9f0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
1ea00 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
1ea10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1ea20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ea30 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
1ea40 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1ea50 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
1ea60 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
1ea70 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
1ea80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1ea90 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
1eaa0 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
1eab0 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
1eac0 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
1ead0 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
1eae0 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
1eaf0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
1eb00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eb10 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
1eb20 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
1eb30 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1eb40 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b  e, pE->x.pList);
1eb50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1eb60 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1eb70 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1eb80 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
1eb90 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
1ebc0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
1ebd0 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a  NDOFF);.      }.
1ebe0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1ebf0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
1ec00 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
1ec10 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
1ec20 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1ec30 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
1ec40 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
1ec50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
1ec60 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
1ec70 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
1ec80 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1ec90 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
1eca0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1ecb0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1ecc0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
1ecd0 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
1ece0 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
1ecf0 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
1ed00 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
1ed10 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
1ed20 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
1ed30 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
1ed40 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ed50 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
1ed60 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1ed70 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
1ed80 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1ed90 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
1eda0 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
1edb0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30  st->nExpr : 0, 0
1edc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1edd0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1ede0 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
1edf0 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
1ee00 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
1ee10 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
1ee20 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
1ee30 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
1ee40 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
1ee50 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
1ee60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ee70 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
1ee80 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
1ee90 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1eea0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
1eeb0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1eec0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1eed0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
1eee0 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
1eef0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
1ef00 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
1ef10 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 73 71  ctMode = 1;.  sq
1ef20 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
1ef30 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
1ef40 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
1ef50 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
1ef60 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1ef70 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
1ef80 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
1ef90 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
1efa0 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
1efb0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
1efc0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
1efd0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
1efe0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1eff0 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
1f000 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1f010 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
1f020 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
1f030 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
1f040 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
1f050 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1f060 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
1f070 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f080 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
1f090 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
1f0a0 41 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  Agg, 1);.    }el
1f0b0 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  se{.      nArg =
1f0c0 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67   0;.      regAgg
1f0d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1f0e0 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  if( pF->iDistinc
1f0f0 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  t>=0 ){.      ad
1f100 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
1f110 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1f120 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f130 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nArg==1 );.     
1f140 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
1f150 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69  arse, pF->iDisti
1f160 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31  nct, addrNext, 1
1f170 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d  , regAgg);.    }
1f180 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75  .    if( pF->pFu
1f190 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  nc->flags & SQLI
1f1a0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
1f1b0 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
1f1c0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
1f1d0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
1f1e0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1f1f0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
1f200 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
1f210 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
1f220 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
1f230 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a  c has NEEDCOLL *
1f240 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
1f250 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
1f260 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
1f270 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
1f280 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
1f290 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1f2a0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
1f2b0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
1f2c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
1f2d0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
1f2e0 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
1f2f0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
1f300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1f310 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1f320 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
1f330 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
1f340 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
1f350 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1f360 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1f370 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
1f380 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
1f390 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
1f3a0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
1f3b0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
1f3c0 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
1f3d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1f3e0 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
1f3f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f400 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1f410 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
1f420 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
1f430 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
1f440 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
1f450 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
1f460 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
1f470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f480 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1f490 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
1f4a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f4b0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
1f4c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1f4d0 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
1f4e0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
1f4f0 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
1f500 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
1f510 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
1f520 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
1f530 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
1f540 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
1f550 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
1f560 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
1f570 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
1f580 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
1f590 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
1f5a0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
1f5b0 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
1f5c0 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
1f5d0 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
1f5e0 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
1f5f0 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
1f600 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
1f610 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
1f620 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
1f630 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
1f640 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
1f650 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
1f660 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
1f670 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
1f680 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
1f690 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
1f6a0 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
1f6b0 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
1f6c0 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
1f6d0 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  Copy..  */.  sql
1f6e0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
1f6f0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
1f700 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
1f710 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
1f720 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
1f730 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
1f740 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f750 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
1f760 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
1f770 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
1f780 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
1f790 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1f7a0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
1f7b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
1f7c0 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c  a single OP_Expl
1f7d0 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
1f7e0 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65  to the VDBE to e
1f7f0 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a  xplain a simple.
1f800 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72  ** count(*) quer
1f810 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  y ("SELECT count
1f820 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e  (*) FROM pTab").
1f830 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1f840 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
1f850 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
1f860 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a  ainSimpleCount(.
1f870 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
1f8a0 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
1f8b0 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
1f8c0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1f8d0 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
1f8e0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f900 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65      /* Index use
1f910 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63  d to optimize sc
1f920 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  an, or NULL */.)
1f930 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
1f940 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
1f950 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73    char *zEqp = s
1f960 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
1f970 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20  arse->db, "SCAN 
1f980 54 41 42 4c 45 20 25 73 20 25 73 25 73 28 7e 25  TABLE %s %s%s(~%
1f990 64 20 72 6f 77 73 29 22 2c 0a 20 20 20 20 20 20  d rows)",.      
1f9a0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a    pTab->zName, .
1f9b0 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 22          pIdx ? "
1f9c0 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
1f9d0 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20  NDEX " : "",.   
1f9e0 20 20 20 20 20 70 49 64 78 20 3f 20 70 49 64 78       pIdx ? pIdx
1f9f0 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 2c 0a 20 20  ->zName : "",.  
1fa00 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
1fa10 45 73 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  Est.    );.    s
1fa20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1fa30 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
1fa40 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c  ->pVdbe, OP_Expl
1fa50 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
1fa60 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45  lectId, 0, 0, zE
1fa70 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20  qp, P4_DYNAMIC. 
1fa80 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73     );.  }.}.#els
1fa90 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
1faa0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c  inSimpleCount(a,
1fab0 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
1fac0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1fad0 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20   for the SELECT 
1fae0 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1faf0 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e  in the p argumen
1fb00 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  t.  .**.** The r
1fb10 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72  esults are distr
1fb20 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75  ibuted in variou
1fb30 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67  s ways depending
1fb40 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   on the.** conte
1fb50 6e 74 73 20 6f 66 20 74 68 65 20 53 65 6c 65 63  nts of the Selec
1fb60 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 20  tDest structure 
1fb70 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72  pointed to by ar
1fb80 67 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20  gument pDest.** 
1fb90 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1fba0 2a 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65  *     pDest->eDe
1fbb0 73 74 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20  st    Result.** 
1fbc0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
1fbd0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
1fbe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fbf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1fc00 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75 74 70 75  **     SRT_Outpu
1fc10 74 20 20 20 20 20 20 47 65 6e 65 72 61 74 65 20  t      Generate 
1fc20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  a row of output 
1fc30 28 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 52 65  (using the OP_Re
1fc40 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20  sultRow.**      
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1fc60 70 63 6f 64 65 29 20 66 6f 72 20 65 61 63 68 20  pcode) for each 
1fc70 72 6f 77 20 69 6e 20 74 68 65 20 72 65 73 75 6c  row in the resul
1fc80 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  t set..**.**    
1fc90 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20   SRT_Mem        
1fca0 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 74   Only valid if t
1fcb0 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73  he result is a s
1fcc0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  ingle column..**
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fce0 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 66       Store the f
1fcf0 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
1fd00 68 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20  he first result 
1fd10 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  row.**          
1fd20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 72 65             in re
1fd30 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50  gister pDest->iP
1fd40 61 72 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e  arm then abandon
1fd50 20 74 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20   the rest.**    
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 6f 66 20 74 68 65 20 71 75 65 72 79 2e 20 20   of the query.  
1fd80 54 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e  This destination
1fd90 20 69 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20   implies "LIMIT 
1fda0 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  1"..**.**     SR
1fdb0 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 54 68  T_Set         Th
1fdc0 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65  e result must be
1fdd0 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
1fde0 2e 20 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a  .  Store each.**
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75       row of resu
1fe10 6c 74 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e  lt as the key in
1fe20 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1fe30 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20  arm. .**        
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70               App
1fe50 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ly the affinity 
1fe60 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20  pDest->affinity 
1fe70 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a  before storing.*
1fe80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1fe90 20 20 20 20 20 20 72 65 73 75 6c 74 73 2e 20 20        results.  
1fea0 55 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  Used to implemen
1feb0 74 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  t "IN (SELECT ..
1fec0 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  .)"..**.**     S
1fed0 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
1fee0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
1fef0 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
1ff00 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
1ff10 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ->iParm..**.**  
1ff20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
1ff30 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
1ff40 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f  s from the tempo
1ff50 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
1ff60 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ->iParm..**.**  
1ff70 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20     SRT_Table    
1ff80 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
1ff90 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
1ffa0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1ffb0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1ffc0 20 20 20 20 20 20 20 20 20 54 68 69 73 20 69 73           This is
1ffd0 20 6c 69 6b 65 20 53 52 54 5f 45 70 68 65 6d 54   like SRT_EphemT
1ffe0 61 62 20 65 78 63 65 70 74 20 74 68 61 74 20 74  ab except that t
1fff0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  he table.**     
20000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20010 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 61 6c  is assumed to al
20020 72 65 61 64 79 20 62 65 20 6f 70 65 6e 2e 0a 2a  ready be open..*
20030 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70 68  *.**     SRT_Eph
20040 65 6d 54 61 62 20 20 20 20 43 72 65 61 74 65 20  emTab    Create 
20050 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  an temporary tab
20060 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  le pDest->iParm 
20070 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20  and store.**    
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 74 68 65 20 72 65 73 75 6c 74 20 74 68 65 72   the result ther
200a0 65 2e 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  e. The cursor is
200b0 20 6c 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72   left open after
200c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
200d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e          returnin
200e0 67 2e 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65  g.  This is like
200f0 20 53 52 54 5f 54 61 62 6c 65 20 65 78 63 65 70   SRT_Table excep
20100 74 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  t that.**       
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
20120 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 75  is destination u
20130 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ses OP_OpenEphem
20140 65 72 61 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a  eral to create.*
20150 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20160 20 20 20 20 20 20 74 68 65 20 74 61 62 6c 65 20        the table 
20170 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  first..**.**    
20180 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20   SRT_Coroutine  
20190 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72   Generate a co-r
201a0 6f 75 74 69 6e 65 20 74 68 61 74 20 72 65 74 75  outine that retu
201b0 72 6e 73 20 61 20 6e 65 77 20 72 6f 77 20 6f 66  rns a new row of
201c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
201d0 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 73 20          results 
201e0 65 61 63 68 20 74 69 6d 65 20 69 74 20 69 73 20  each time it is 
201f0 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e  invoked.  The en
20200 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20  try point.**    
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20220 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   of the co-routi
20230 6e 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ne is stored in 
20240 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e  register pDest->
20250 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
20260 20 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20   SRT_Exists     
20270 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65   Store a 1 in me
20280 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d  mory cell pDest-
20290 3e 69 50 61 72 6d 20 69 66 20 74 68 65 20 72 65  >iParm if the re
202a0 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  sult.**         
202b0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
202c0 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a  is not empty..**
202d0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63  .**     SRT_Disc
202e0 61 72 64 20 20 20 20 20 54 68 72 6f 77 20 74 68  ard     Throw th
202f0 65 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e 20  e results away. 
20300 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
20310 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
20330 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e  tatements within
20340 20 74 72 69 67 67 65 72 73 20 77 68 6f 73 65 20   triggers whose 
20350 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73 0a  only purpose is.
20360 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20370 20 20 20 20 20 20 20 74 68 65 20 73 69 64 65 2d         the side-
20380 65 66 66 65 63 74 73 20 6f 66 20 66 75 6e 63 74  effects of funct
20390 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
203a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
203b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
203c0 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
203d0 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
203e0 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
203f0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
20400 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
20410 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
20420 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
20430 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
20440 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
20450 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
20460 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
20470 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
20480 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
20490 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71   that..*/.int sq
204a0 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50  lite3Select(.  P
204b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
204c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
204d0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
204e0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
204f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
20500 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
20510 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
20520 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
20530 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74  est      /* What
20540 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
20550 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
20560 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20580 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
20590 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
205a0 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74  Info;     /* Ret
205b0 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  urn from sqlite3
205c0 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
205d0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
205e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
205f0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
20600 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
20610 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  on */.  int isAg
20620 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
20630 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63  * True for selec
20640 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f  t lists like "co
20650 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70  unt(*)" */.  Exp
20660 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
20670 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
20680 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63  olumns to extrac
20690 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
206a0 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f  *pTabList;     /
206b0 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
206c0 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20   to select from 
206d0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
206e0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
206f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
20700 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
20710 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
20720 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  derBy;    /* The
20730 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20740 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
20750 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
20760 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
20770 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
20780 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
20790 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
207a0 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
207b0 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
207c0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
207d0 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e  /.  int isDistin
207e0 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
207f0 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
20800 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
20810 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64  esent */.  int d
20820 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
20830 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73    /* Table to us
20840 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
20850 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  ct set */.  int 
20860 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
20870 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
20880 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
20890 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
208a0 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
208b0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
208c0 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68  of an OP_OpenEph
208d0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
208e0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
208f0 44 69 73 74 69 6e 63 74 49 6e 64 65 78 3b 20 2f  DistinctIndex; /
20900 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20  * Address of an 
20910 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
20920 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
20930 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
20940 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
20950 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
20960 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
20970 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20990 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
209a0 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
209b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
209c0 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
209d0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
209e0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e  nection */..#ifn
209f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20a00 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52  EXPLAIN.  int iR
20a10 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d  estoreSelectId =
20a20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
20a30 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53  Id;.  pParse->iS
20a40 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
20a50 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b  ->iNextSelectId+
20a60 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20  +;.#endif..  db 
20a70 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
20a80 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
20a90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
20aa0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
20ab0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
20ac0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
20ad0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
20ae0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
20af0 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
20b00 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
20b10 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
20b20 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a  of(sAggInfo));..
20b30 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
20b40 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
20b50 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73  .    assert(pDes
20b60 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
20b70 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ists || pDest->e
20b80 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
20b90 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  || .           p
20ba0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
20bb0 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74  _Except || pDest
20bc0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
20bd0 63 61 72 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66  card);.    /* If
20be0 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20   ORDER BY makes 
20bf0 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e  no difference in
20c00 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e   the output then
20c10 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20   neither does.  
20c20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f    ** DISTINCT so
20c30 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76   it can be remov
20c40 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73  ed too. */.    s
20c50 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
20c60 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
20c70 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  erBy);.    p->pO
20c80 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
20c90 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
20ca0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  SF_Distinct;.  }
20cb0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
20cc0 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
20cd0 30 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  0);.  pOrderBy =
20ce0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
20cf0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
20d00 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
20d10 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
20d20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
20d30 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20d40 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
20d50 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
20d60 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  sAgg = (p->selFl
20d70 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
20d80 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74  te)!=0;.  assert
20d90 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a  ( pEList!=0 );..
20da0 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
20db0 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f  ating code..  */
20dc0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
20dd0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
20de0 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
20df0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
20e00 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
20e10 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
20e20 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
20e30 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
20e40 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
20e50 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  put..  */.#ifnde
20e60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
20e70 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65  BQUERY.  if( che
20e80 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
20e90 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  SelectError(pPar
20ea0 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73  se, pDest, pELis
20eb0 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
20ec0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
20ed0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
20ee0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
20ef0 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
20f00 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
20f10 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66   clause.  */.#if
20f20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
20f30 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
20f40 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
20f50 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
20f60 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
20f70 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
20f80 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
20f90 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
20fa0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
20fb0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
20fc0 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20  .    SelectDest 
20fd0 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  dest;.    Select
20fe0 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
20ff0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
21000 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20   isAggSub;..    
21010 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 70  if( pSub==0 || p
21020 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
21030 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  d ) continue;.. 
21040 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
21050 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79  Parse.nHeight by
21060 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74   the height of t
21070 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65  he largest expre
21080 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65  ssion.    ** tre
21090 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20  e refered to by 
210a0 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74  this, the parent
210b0 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69   select. The chi
210c0 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a  ld select.    **
210d0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70   may contain exp
210e0 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66  ression trees of
210f0 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20   at most.    ** 
21100 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  (SQLITE_MAX_EXPR
21110 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65  _DEPTH-Parse.nHe
21120 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68  ight) height. Th
21130 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20  is is a bit.    
21140 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61  ** more conserva
21150 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73  tive than necess
21160 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61  ary, but much ea
21170 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63  sier than enforc
21180 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78  ing.    ** an ex
21190 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a  act limit..    *
211a0 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  /.    pParse->nH
211b0 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33  eight += sqlite3
211c0 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
211d0 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
211e0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
211f0 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
21200 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 74   absorbed into t
21210 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  he parent. */.  
21220 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53    isAggSub = (pS
21230 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
21240 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
21250 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
21260 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
21270 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73   p, i, isAgg, is
21280 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20  AggSub) ){.     
21290 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
212a0 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
212b0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
212c0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
212d0 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
212e0 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
212f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21300 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
21310 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
21320 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d  _EphemTab, pItem
21330 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
21340 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
21350 3e 69 73 50 6f 70 75 6c 61 74 65 64 3d 3d 30 20  >isPopulated==0 
21360 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
21370 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
21380 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
21390 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
213a0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
213b0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
213c0 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
213d0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
213e0 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b  isPopulated = 1;
213f0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
21400 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75  ab->nRowEst = (u
21410 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53  nsigned)pSub->nS
21420 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 7d 0a  electRow;.    }.
21430 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65      if( /*pParse
21440 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e  ->nErr ||*/ db->
21450 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
21460 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
21470 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
21480 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
21490 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
214a0 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
214b0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
214c0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
214d0 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
214e0 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
214f0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
21500 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
21510 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
21520 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66  ->pEList;.#endif
21530 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
21540 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
21550 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
21560 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
21570 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73  pHaving;.  isDis
21580 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  tinct = (p->selF
21590 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
215a0 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66  ct)!=0;..#ifndef
215b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
215c0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
215d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
215e0 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
215f0 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
21600 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
21610 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
21620 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
21630 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
21640 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65  t==0 ){.      Se
21650 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52  lect *pLoop, *pR
21660 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
21670 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
21680 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b     int mxSelect;
21690 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  .      for(pLoop
216a0 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
216b0 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20  =pLoop->pPrior, 
216c0 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  cnt++){.        
216d0 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73  pLoop->pRightmos
216e0 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70  t = p;.        p
216f0 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52  Loop->pNext = pR
21700 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52  ight;.        pR
21710 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  ight = pLoop;.  
21720 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65      }.      mxSe
21730 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  lect = db->aLimi
21740 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
21750 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b  OMPOUND_SELECT];
21760 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c  .      if( mxSel
21770 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c  ect && cnt>mxSel
21780 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
21790 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
217a0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
217b0 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75   terms in compou
217c0 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20  nd SELECT");.   
217d0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
217e0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
217f0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c    }.    rc = mul
21800 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
21810 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
21820 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
21830 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
21840 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
21850 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75  ectId);.    retu
21860 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
21870 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  f..  /* If there
21880 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50   is both a GROUP
21890 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52   BY and an ORDER
218a0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
218b0 68 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65  hey are.  ** ide
218c0 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73  ntical, then dis
218d0 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
218e0 59 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74  Y clause since t
218f0 68 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a  he GROUP BY.  **
21900 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d   will cause elem
21910 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74  ents to come out
21920 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
21930 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a  order.  This is.
21940 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61    ** an optimiza
21950 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65  tion - the corre
21960 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64  ct answer should
21970 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65   result regardle
21980 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65  ss..  ** Use the
21990 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
219a0 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
219b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
219c0 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f  PTIMIZER.  ** to
219d0 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70   disable this op
219e0 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
219f0 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
21a00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
21a10 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
21a20 72 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  re(p->pGroupBy, 
21a30 70 4f 72 64 65 72 42 79 29 3d 3d 30 0a 20 20 20  pOrderBy)==0.   
21a40 20 20 20 20 20 20 26 26 20 28 64 62 2d 3e 66 6c        && (db->fl
21a50 61 67 73 20 26 20 53 51 4c 49 54 45 5f 47 72 6f  ags & SQLITE_Gro
21a60 75 70 42 79 4f 72 64 65 72 29 3d 3d 30 20 29 7b  upByOrder)==0 ){
21a70 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
21a80 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
21a90 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
21aa0 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
21ab0 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
21ac0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
21ad0 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
21ae0 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
21af0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
21b00 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
21b10 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
21b20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
21b30 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
21b40 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
21b50 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
21b60 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
21b70 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
21b80 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
21b90 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
21ba0 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
21bb0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
21bc0 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
21bd0 20 47 52 4f 55 50 20 42 59 20 78 79 7a 0a 20 20   GROUP BY xyz.  
21be0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
21bf0 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
21c00 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
21c10 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
21c20 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
21c30 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
21c40 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
21c50 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
21c60 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
21c70 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
21c80 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
21c90 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
21ca0 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
21cb0 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
21cc0 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
21cd0 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
21ce0 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
21cf0 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
21d00 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
21d10 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
21d20 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
21d30 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
21d40 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
21d50 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
21d60 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 4f 72  rListCompare(pOr
21d70 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74  derBy, p->pEList
21d80 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d  )==0.  ){.    p-
21d90 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
21da0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70  _Distinct;.    p
21db0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
21dc0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
21dd0 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30  db, p->pEList, 0
21de0 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  );.    pGroupBy 
21df0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
21e00 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
21e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
21e20 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
21e30 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
21e40 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a  this sorting.  *
21e50 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  * index might en
21e60 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65  d up being unuse
21e70 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
21e80 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61  n be .  ** extra
21e90 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
21ea0 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68  ed order.  If th
21eb0 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
21ec0 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50  then the.  ** OP
21ed0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
21ee0 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
21ef0 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  be changed to an
21f00 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20   OP_Noop once.  
21f10 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ** we figure out
21f20 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
21f30 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e  g index is not n
21f40 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72  eeded.  The addr
21f50 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76  SortIndex.  ** v
21f60 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
21f70 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68  to facilitate th
21f80 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
21f90 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
21fa0 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
21fb0 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
21fc0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
21fd0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
21fe0 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  se, pOrderBy);. 
21ff0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
22000 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
22010 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61  nTab++;.    p->a
22020 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
22030 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
22040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22050 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
22060 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22080 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
22090 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72  y->iECursor, pOr
220a0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
220b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
220d0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
220e0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
220f0 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
22100 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
22110 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
22120 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
22130 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
22140 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
22150 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
22160 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
22170 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
22180 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
22190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
221a0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
221b0 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  ral, pDest->iPar
221c0 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
221d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
221e0 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
221f0 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
22200 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
22210 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
22220 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 4c  tRow = (double)L
22230 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20  ARGEST_INT64;.  
22240 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
22250 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
22260 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d   iEnd);.  if( p-
22270 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 61 64  >iLimit==0 && ad
22280 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
22290 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
222a0 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 53 6f  eGetOp(v, addrSo
222b0 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65  rtIndex)->opcode
222c0 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e   = OP_SorterOpen
222d0 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
222e0 73 20 7c 3d 20 53 46 5f 55 73 65 53 6f 72 74 65  s |= SF_UseSorte
222f0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  r;.  }..  /* Ope
22300 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
22310 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
22320 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
22330 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
22340 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
22350 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  nct ){.    KeyIn
22360 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
22370 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
22380 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
22390 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
223a0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
223b0 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
223c0 74 29 3b 0a 20 20 20 20 61 64 64 72 44 69 73 74  t);.    addrDist
223d0 69 6e 63 74 49 6e 64 65 78 20 3d 20 73 71 6c 69  inctIndex = sqli
223e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
223f0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
22400 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20  l, distinct, 0, 
22410 30 2c 0a 20 20 20 20 20 20 20 20 28 63 68 61 72  0,.        (char
22420 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
22430 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
22440 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
22450 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
22460 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
22470 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
22480 6e 63 74 20 3d 20 61 64 64 72 44 69 73 74 69 6e  nct = addrDistin
22490 63 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  ctIndex = -1;.  
224a0 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74  }..  /* Aggregat
224b0 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67  e and non-aggreg
224c0 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20  ate queries are 
224d0 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
224e0 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  tly */.  if( !is
224f0 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
22500 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  =0 ){.    ExprLi
22510 73 74 20 2a 70 44 69 73 74 20 3d 20 28 69 73 44  st *pDist = (isD
22520 69 73 74 69 6e 63 74 20 3f 20 70 2d 3e 70 45 4c  istinct ? p->pEL
22530 69 73 74 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  ist : 0);..    /
22540 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
22550 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
22560 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
22570 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
22580 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
22590 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79  Where, &pOrderBy
225a0 2c 20 70 44 69 73 74 2c 20 30 29 3b 0a 20 20 20  , pDist, 0);.   
225b0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
225c0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
225d0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
225e0 2d 3e 6e 52 6f 77 4f 75 74 20 3c 20 70 2d 3e 6e  ->nRowOut < p->n
225f0 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
22600 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 57 49 6e  SelectRow = pWIn
22610 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20  fo->nRowOut;..  
22620 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
22630 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
22640 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
22650 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
22660 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
22670 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
22680 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
22690 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
226a0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
226b0 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
226c0 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
226d0 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f  /.    if( addrSo
226e0 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f  rtIndex>=0 && pO
226f0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
22700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
22710 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
22720 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b  drSortIndex, 1);
22730 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
22740 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
22750 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
22760 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
22770 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 4f 70   ){.      VdbeOp
22780 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20   *pOp;          
22790 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67        /* No long
227a0 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e  er required Open
227b0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e  Ephemeral instr.
227c0 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20   */.     .      
227d0 61 73 73 65 72 74 28 20 61 64 64 72 44 69 73 74  assert( addrDist
227e0 69 6e 63 74 49 6e 64 65 78 3e 3d 30 20 29 3b 0a  inctIndex>=0 );.
227f0 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
22800 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
22810 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64 65  addrDistinctInde
22820 78 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  x);..      asser
22830 74 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 3b  t( isDistinct );
22840 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22850 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
22860 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
22870 5f 4f 52 44 45 52 45 44 20 0a 20 20 20 20 20 20  _ORDERED .      
22880 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e       || pWInfo->
22890 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45  eDistinct==WHERE
228a0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
228b0 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
228c0 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a   distinct = -1;.
228d0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
228e0 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
228f0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
22900 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  RED ){.        i
22910 6e 74 20 69 4a 75 6d 70 3b 0a 20 20 20 20 20 20  nt iJump;.      
22920 20 20 69 6e 74 20 69 45 78 70 72 3b 0a 20 20 20    int iExpr;.   
22930 20 20 20 20 20 69 6e 74 20 69 46 6c 61 67 20 3d       int iFlag =
22940 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
22950 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 42 61  .        int iBa
22960 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
22970 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m+1;.        int
22980 20 69 42 61 73 65 32 20 3d 20 69 42 61 73 65 20   iBase2 = iBase 
22990 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  + pEList->nExpr;
229a0 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
229b0 3e 6e 4d 65 6d 20 2b 3d 20 28 70 45 4c 69 73 74  >nMem += (pEList
229c0 2d 3e 6e 45 78 70 72 2a 32 29 3b 0a 0a 20 20 20  ->nExpr*2);..   
229d0 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
229e0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
229f0 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65  ral coded earlie
22a00 72 20 74 6f 20 61 6e 20 4f 50 5f 49 6e 74 65 67  r to an OP_Integ
22a10 65 72 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  er. The.        
22a20 2a 2a 20 4f 50 5f 49 6e 74 65 67 65 72 20 69 6e  ** OP_Integer in
22a30 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 22 66  itializes the "f
22a40 69 72 73 74 20 72 6f 77 22 20 66 6c 61 67 2e 20  irst row" flag. 
22a50 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   */.        pOp-
22a60 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 6e 74  >opcode = OP_Int
22a70 65 67 65 72 3b 0a 20 20 20 20 20 20 20 20 70 4f  eger;.        pO
22a80 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->p1 = 1;.     
22a90 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 69 46 6c     pOp->p2 = iFl
22aa0 61 67 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c  ag;..        sql
22ab0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
22ac0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
22ad0 69 73 74 2c 20 69 42 61 73 65 2c 20 31 29 3b 0a  ist, iBase, 1);.
22ae0 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
22af0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
22b00 6e 74 41 64 64 72 28 76 29 20 2b 20 31 20 2b 20  ntAddr(v) + 1 + 
22b10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20  pEList->nExpr + 
22b20 31 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 73  1 + 1;.        s
22b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22b40 28 76 2c 20 4f 50 5f 49 66 2c 20 69 46 6c 61 67  (v, OP_If, iFlag
22b50 2c 20 69 4a 75 6d 70 2d 31 29 3b 0a 20 20 20 20  , iJump-1);.    
22b60 20 20 20 20 66 6f 72 28 69 45 78 70 72 3d 30 3b      for(iExpr=0;
22b70 20 69 45 78 70 72 3c 70 45 4c 69 73 74 2d 3e 6e   iExpr<pEList->n
22b80 45 78 70 72 3b 20 69 45 78 70 72 2b 2b 29 7b 0a  Expr; iExpr++){.
22b90 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
22ba0 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
22bb0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
22bc0 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
22bd0 69 45 78 70 72 5d 2e 70 45 78 70 72 29 3b 0a 20  iExpr].pExpr);. 
22be0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22bf0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
22c00 5f 4e 65 2c 20 69 42 61 73 65 2b 69 45 78 70 72  _Ne, iBase+iExpr
22c10 2c 20 69 4a 75 6d 70 2c 20 69 42 61 73 65 32 2b  , iJump, iBase2+
22c20 69 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  iExpr);.        
22c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
22c40 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f  ngeP4(v, -1, (co
22c50 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c  nst char *)pColl
22c60 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
22c70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22c80 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
22c90 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
22ca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22cc0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
22cd0 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74  0, pWInfo->iCont
22ce0 69 6e 75 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  inue);..        
22cf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22d00 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
22d10 20 30 2c 20 69 46 6c 61 67 29 3b 0a 20 20 20 20   0, iFlag);.    
22d20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
22d30 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
22d40 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a  dr(v)==iJump );.
22d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22d60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
22d70 4d 6f 76 65 2c 20 69 42 61 73 65 2c 20 69 42 61  Move, iBase, iBa
22d80 73 65 32 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  se2, pEList->nEx
22d90 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
22da0 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  {.        pOp->o
22db0 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
22dc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
22dd0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
22de0 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
22df0 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63  op. */.    selec
22e00 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
22e10 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
22e20 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
22e30 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e50 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
22e60 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  inue, pWInfo->iB
22e70 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  reak);..    /* E
22e80 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
22e90 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
22ea0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  /.    sqlite3Whe
22eb0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
22ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
22ed0 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63 65  his is the proce
22ee0 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
22ef0 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
22f00 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
22f10 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
22f20 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
22f30 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
22f40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
22f50 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
22f60 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22f70 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
22f80 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
22f90 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
22fa0 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
22fb0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
22fc0 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
22fd0 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
22fe0 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
22ff0 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
23000 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
23010 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
23020 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
23030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23040 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
23050 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
23060 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
23070 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
230a0 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
230b0 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
230c0 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
230d0 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
230e0 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
230f0 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
23100 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
23110 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
23120 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
23130 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
23140 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
23150 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
23160 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
23170 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ECT */.    int s
23180 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f  ortPTab = 0;   /
23190 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73  * Pseudotable us
231a0 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72  ed to decode sor
231b0 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ting results */.
231c0 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20      int sortOut 
231d0 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75  = 0;    /* Outpu
231e0 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20  t register from 
231f0 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20  the sorter */.. 
23200 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
23210 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
23220 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
23230 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
23240 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
23250 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
23260 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
23270 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
23280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23290 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
232a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
232b0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
232c0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
232d0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
232e0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
232f0 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
23300 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
23310 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
23320 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
23330 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
23340 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
23350 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
23360 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d    }.      for(k=
23370 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
23380 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d   pItem=pGroupBy-
23390 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
233a0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
233b0 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
233c0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
233d0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
233e0 6f 77 3e 28 64 6f 75 62 6c 65 29 31 30 30 20 29  ow>(double)100 )
233f0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
23400 20 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a 20 20   (double)100;.  
23410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
23420 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28  ->nSelectRow = (
23430 64 6f 75 62 6c 65 29 31 3b 0a 20 20 20 20 7d 0a  double)1;.    }.
23440 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  . .    /* Create
23450 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70   a label to jump
23460 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74   to when we want
23470 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75   to abort the qu
23480 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45  ery */.    addrE
23490 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
234a0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
234b0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
234c0 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
234d0 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
234e0 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
234f0 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
23500 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
23510 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
23520 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
23530 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
23540 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
23550 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
23560 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
23570 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
23580 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
23590 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
235a0 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
235b0 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
235c0 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
235d0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
235e0 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
235f0 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
23600 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20  ->nExpr+1 : 0;. 
23610 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
23620 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
23630 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
23640 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
23650 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  sNC, pEList);.  
23660 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
23670 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
23680 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
23690 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
236a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
236b0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
236c0 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
236d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
236e0 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
236f0 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
23700 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
23710 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
23720 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
23730 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
23740 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
23750 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
23760 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
23770 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
23780 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
23790 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
237a0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
237b0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
237c0 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
237d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
237e0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
237f0 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
23800 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
23810 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
23820 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
23830 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
23840 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
23850 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77  han aggregates w
23860 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
23870 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
23880 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
23890 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
238a0 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
238b0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
238c0 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
238d0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
238e0 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
238f0 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d     /* A-vs-B com
23900 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f  parision jump */
23910 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f  .      int addrO
23920 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74  utputRow;  /* St
23930 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  art of subroutin
23940 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
23950 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
23960 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70       int regOutp
23970 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75  utRow;   /* Retu
23980 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
23990 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73  ter for output s
239a0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
239b0 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62     int addrSetAb
239c0 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68  ort;   /* Set th
239d0 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
239e0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20   return */.     
239f0 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
23a00 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  op;  /* Top of t
23a10 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
23a20 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
23a30 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68  ortingIdx; /* Th
23a40 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
23a50 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
23a60 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
23a70 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
23a80 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
23a90 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
23aa0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
23ab0 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  r */.      int r
23ac0 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f  egReset;       /
23ad0 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
23ae0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65   register for re
23af0 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  set subroutine *
23b00 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  /..      /* If t
23b10 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
23b20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
23b30 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
23b40 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
23b50 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
23b60 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
23b70 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
23b80 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
23b90 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
23ba0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
23bb0 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
23bc0 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
23bd0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  n instruction.  
23be0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
23bf0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
23c00 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
23c10 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
23c20 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
23c30 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
23c40 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
23c50 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
23c60 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
23c70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53  By);.      addrS
23c80 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
23c90 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
23ca0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
23cb0 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
23cc0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
23cd0 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
23ce0 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
23cf0 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
23d00 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
23d10 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20  FO_HANDOFF);..  
23d20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
23d30 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
23d40 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
23d50 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
23d60 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
23d70 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
23d80 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
23d90 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
23da0 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
23db0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
23dc0 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
23dd0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
23de0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
23df0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
23e00 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
23e10 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
23e20 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
23e30 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
23e40 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
23e50 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
23e60 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
23e70 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
23e80 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
23e90 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
23ea0 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
23eb0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
23ec0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
23ed0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
23ee0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
23ef0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
23f00 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
23f10 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
23f20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
23f30 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
23f40 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
23f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23f60 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
23f70 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
23f80 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
23f90 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
23fa0 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
23fb0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
23fc0 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
23fd0 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
23fe0 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
23ff0 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
24000 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
24010 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
24020 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
24030 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
24040 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
24050 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
24060 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
24070 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
24080 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
24090 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
240a0 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
240b0 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
240c0 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
240d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
240e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
240f0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
24100 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
24110 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
24120 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
24130 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
24140 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 2c  e, &pGroupBy, 0,
24150 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
24160 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
24170 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
24180 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
24190 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
241a0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
241b0 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
241c0 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
241d0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
241e0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
241f0 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
24200 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
24210 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
24220 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
24230 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
24240 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
24250 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
24260 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
24270 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75 70  /.        pGroup
24280 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
24290 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ;.        groupB
242a0 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
242b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
242c0 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
242d0 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
242e0 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
242f0 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
24300 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
24310 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
24320 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
24330 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
24340 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
24350 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
24360 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
24370 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
24380 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
24390 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
243a0 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
243b0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
243c0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
243d0 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
243e0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
243f0 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
24400 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70  By;..        exp
24410 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
24420 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
24430 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 26 26     isDistinct &&
24440 20 21 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53   !(p->selFlags&S
24450 46 5f 44 69 73 74 69 6e 63 74 29 3f 22 44 49 53  F_Distinct)?"DIS
24460 54 49 4e 43 54 22 3a 22 47 52 4f 55 50 20 42 59  TINCT":"GROUP BY
24470 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f  ");..        gro
24480 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20  upBySort = 1;.  
24490 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d        nGroupBy =
244a0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
244b0 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ;.        nCol =
244c0 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20   nGroupBy + 1;. 
244d0 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
244e0 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  pBy+1;.        f
244f0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
24500 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
24510 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
24520 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
24530 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
24540 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
24550 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
24560 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
24570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24580 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
24590 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
245a0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
245b0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
245c0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
245d0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
245e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
245f0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
24600 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65  se, pGroupBy, re
24610 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20  gBase, 0);.     
24620 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24630 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
24640 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  nce, sAggInfo.so
24650 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65  rtingIdx,regBase
24660 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  +nGroupBy);.    
24670 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
24680 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +1;.        for(
24690 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
246a0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
246b0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
246c0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
246d0 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
246e0 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
246f0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
24700 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
24710 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
24720 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b  1 = j + regBase;
24730 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
24740 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20   r2;..          
24750 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
24760 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
24770 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24790 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
247a0 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  ab, pCol->iColum
247b0 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  n, pCol->iTable,
247c0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
247d0 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a    if( r1!=r2 ){.
247e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
247f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24800 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c  v, OP_SCopy, r2,
24810 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
24820 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24830 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
24840 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24850 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
24860 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
24870 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
24880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24890 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
248a0 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
248b0 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
248c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
248d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
248e0 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73  _SorterInsert, s
248f0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
24900 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
24910 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
24920 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
24930 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
24940 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24950 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
24960 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
24970 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
24980 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
24990 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
249a0 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
249b0 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72  ingIdxPTab = sor
249c0 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  tPTab = pParse->
249d0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
249e0 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65  sortOut = sqlite
249f0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
24a00 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
24a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
24a20 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
24a30 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f   sortPTab, sortO
24a40 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ut, nCol);.     
24a50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24a60 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
24a70 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rSort, sAggInfo.
24a80 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
24a90 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
24aa0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
24ab0 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
24ac0 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
24ad0 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
24ae0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
24af0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
24b00 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
24b10 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
24b20 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
24b30 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
24b40 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
24b50 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
24b60 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
24b70 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
24b80 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
24b90 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
24ba0 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
24bb0 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
24bc0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
24bd0 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
24be0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
24bf0 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
24c00 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
24c10 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
24c20 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
24c30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
24c40 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
24c50 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
24c60 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
24c70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
24c80 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
24c90 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
24ca0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
24cb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24cc0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  2(v, OP_SorterDa
24cd0 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ta, sAggInfo.sor
24ce0 74 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74  tingIdx, sortOut
24cf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24d00 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
24d10 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
24d20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
24d30 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
24d40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24d50 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
24d60 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62  Column, sortPTab
24d70 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
24d80 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
24d90 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43  0 ) sqlite3VdbeC
24da0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
24db0 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20  G_CLEARCACHE);. 
24dc0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24dd0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
24de0 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
24df0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
24e00 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
24e10 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
24e20 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
24e30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
24e40 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
24e50 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
24e60 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
24e70 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
24e80 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ea0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
24eb0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
24ec0 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71  );.      j1 = sq
24ed0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
24ee0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
24ef0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
24f00 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b  (v, OP_Jump, j1+
24f10 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20  1, 0, j1+1);..  
24f20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
24f30 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
24f40 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
24f50 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
24f60 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69      ** Changes i
24f70 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
24f80 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
24f90 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
24fa0 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
24fb0 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
24fc0 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
24fd0 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
24fe0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
24ff0 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
25000 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
25010 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
25020 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
25030 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
25040 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
25050 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
25060 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
25070 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
25080 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
25090 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
250a0 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
250b0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
250c0 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
250d0 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
250e0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
250f0 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
25100 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65  rse, iBMem, iAMe
25110 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
25120 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
25130 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25140 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
25150 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
25160 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
25170 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
25180 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29  utput one row"))
25190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
251a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
251b0 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  IfPos, iAbortFla
251c0 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  g, addrEnd);.   
251d0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
251e0 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20  v, "check abort 
251f0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
25200 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25210 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
25220 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
25230 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
25240 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
25250 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
25260 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
25270 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
25280 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
25290 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
252a0 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
252b0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
252c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
252d0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
252e0 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75  (v, j1);.      u
252f0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
25300 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
25310 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
25320 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25330 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
25340 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
25350 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
25360 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69  "indicate data i
25370 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  n accumulator"))
25380 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
25390 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
253a0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67    */.      if( g
253b0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
253c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
253d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
253e0 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e  rterNext, sAggIn
253f0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
25400 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
25410 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25420 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
25430 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
25440 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25450 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
25460 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20  addrSortingIdx, 
25470 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
25480 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
25490 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
254a0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
254b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
254c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
254d0 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
254e0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
254f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
25500 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
25510 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20  inal row"));..  
25520 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72      /* Jump over
25530 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
25540 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
25550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25560 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
25570 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20   addrEnd);..    
25580 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
25590 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
255a0 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
255b0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
255c0 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
255d0 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
255e0 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
255f0 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
25600 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
25610 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
25620 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
25630 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
25640 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
25650 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
25660 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
25670 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
25680 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
25690 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
256a0 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
256b0 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
256c0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
256d0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
256e0 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
256f0 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
25700 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
25710 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
25720 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
25730 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
25740 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
25750 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25760 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
25770 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
25780 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
25790 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66  (v, "set abort f
257a0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
257b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
257c0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
257d0 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
257e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
257f0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
25800 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
25810 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
25820 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
25830 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
25840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25850 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
25860 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
25870 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
25880 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
25890 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
258a0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
258b0 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
258c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
258d0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
258e0 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
258f0 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
25900 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
25910 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
25920 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
25930 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
25940 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
25950 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
25960 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
25970 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
25980 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
25990 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
259a0 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20  , 0, pOrderBy,. 
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259c0 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70       distinct, p
259d0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
259e0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
259f0 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
25a00 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
25a10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25a20 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
25a30 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
25a40 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
25a50 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
25a60 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
25a70 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
25a80 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
25a90 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
25aa0 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
25ab0 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
25ac0 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
25ad0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
25ae0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
25af0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65  Reset);.      re
25b00 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
25b10 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
25b20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25b30 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
25b40 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
25b50 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20  t);.     .    } 
25b60 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
25b70 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67  y.  Begin aggreg
25b80 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68  ate queries with
25b90 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f  out GROUP BY: */
25ba0 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
25bb0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
25bc0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
25bd0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
25be0 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65  OUNT.      Table
25bf0 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66   *pTab;.      if
25c00 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70  ( (pTab = isSimp
25c10 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67  leCount(p, &sAgg
25c20 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  Info))!=0 ){.   
25c30 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d       /* If isSim
25c40 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72  pleCount() retur
25c50 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
25c60 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
25c70 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  e, then.        
25c80 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
25c90 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
25ca0 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  orm:.        **.
25cb0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
25cc0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
25cd0 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20  M <tbl>.        
25ce0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
25cf0 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ere the Table st
25d00 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
25d10 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c   represents tabl
25d20 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20  e <tbl>..       
25d30 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
25d40 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
25d50 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20   so common that 
25d60 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  it is optimized 
25d70 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20  specially. The. 
25d80 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75         ** OP_Cou
25d90 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
25da0 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65  s executed eithe
25db0 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20  r on the intkey 
25dc0 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20  table that.     
25dd0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
25de0 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  he data for tabl
25df0 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e  e <tbl> or on on
25e00 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73  e of its indexes
25e10 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  . It.        ** 
25e20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65  is better to exe
25e30 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61  cute the op on a
25e40 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65  n index, as inde
25e50 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20  xes are almost. 
25e60 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
25e70 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c   spread across l
25e80 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74  ess pages than t
25e90 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
25ea0 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ng tables..     
25eb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
25ec0 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71  nst int iDb = sq
25ed0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
25ee0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
25ef0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
25f00 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
25f10 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e   iCsr = pParse->
25f20 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43  nTab++;     /* C
25f30 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d  ursor to scan b-
25f40 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tree */.        
25f50 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f70 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
25f80 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
25f90 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
25fa0 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
25fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
25fc0 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64  info for scanned
25fd0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
25fe0 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
25ff0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
26000 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69         /* Best i
26010 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61  ndex found so fa
26020 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
26030 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74   iRoot = pTab->t
26040 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
26050 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
26060 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65  f scanned b-tree
26070 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c   */..        sql
26080 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
26090 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
260a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
260b0 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
260c0 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
260d0 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
260e0 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ame);..        /
260f0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
26100 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20   index that has 
26110 74 68 65 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74  the least amount
26120 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a   of columns. If.
26130 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 72 65          ** there
26140 20 69 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65   is such an inde
26150 78 2c 20 61 6e 64 20 69 74 20 68 61 73 20 6c 65  x, and it has le
26160 73 73 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20  ss columns than 
26170 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20  the table.      
26180 20 20 2a 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20    ** does, then 
26190 77 65 20 63 61 6e 20 61 73 73 75 6d 65 20 74 68  we can assume th
261a0 61 74 20 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c  at it consumes l
261b0 65 73 73 20 73 70 61 63 65 20 6f 6e 20 64 69 73  ess space on dis
261c0 6b 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  k and.        **
261d0 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20   will therefore 
261e0 62 65 20 63 68 65 61 70 65 72 20 74 6f 20 73 63  be cheaper to sc
261f0 61 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  an to determine 
26200 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
26210 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
26220 74 68 69 73 20 63 61 73 65 20 73 65 74 20 69 52  this case set iR
26230 6f 6f 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  oot to the root 
26240 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
26250 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 0a  he index b-tree.
26260 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70          ** and p
26270 4b 65 79 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b  KeyInfo to the K
26280 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
26290 20 72 65 71 75 69 72 65 64 20 74 6f 20 6e 61 76   required to nav
262a0 69 67 61 74 65 20 74 68 65 0a 20 20 20 20 20 20  igate the.      
262b0 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20    ** index..    
262c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
262d0 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44  * (2011-04-15) D
262e0 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20  o not do a full 
262f0 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64  scan of an unord
26300 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20  ered index..    
26310 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
26320 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68  * In practice th
26330 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
26340 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ure will not be 
26350 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79  used. It is only
26360 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73   .        ** pas
26370 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f  sed to keep OP_O
26380 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20  penRead happy.. 
26390 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
263a0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
263b0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
263c0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
263d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
263e0 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  pIdx->bUnordered
263f0 3d 3d 30 20 26 26 20 28 21 70 42 65 73 74 20 7c  ==0 && (!pBest |
26400 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c  | pIdx->nColumn<
26410 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 29 20  pBest->nColumn) 
26420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
26430 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20  Best = pIdx;.   
26440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26450 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
26460 42 65 73 74 20 26 26 20 70 42 65 73 74 2d 3e 6e  Best && pBest->n
26470 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f  Column<pTab->nCo
26480 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  l ){.          i
26490 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e  Root = pBest->tn
264a0 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b  um;.          pK
264b0 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
264c0 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
264d0 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  rse, pBest);.   
264e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
264f0 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  /* Open a read-o
26500 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63  nly cursor, exec
26510 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74  ute the OP_Count
26520 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73  , close the curs
26530 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  or. */.        s
26540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
26550 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
26560 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44   iCsr, iRoot, iD
26570 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  b);.        if( 
26580 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
26590 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
265a0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
265b0 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66   (char *)pKeyInf
265c0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
265d0 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20  NDOFF);.        
265e0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
265f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
26600 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73  P_Count, iCsr, s
26610 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
26620 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
26630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26640 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
26650 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  Csr);.        ex
26660 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
26670 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
26680 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Best);.      }el
26690 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
266a0 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
266b0 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  UNT */.      {. 
266c0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
266d0 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
266e0 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
266f0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
26700 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26710 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
26720 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
26730 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
26740 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
26750 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
26760 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
26770 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
26780 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
26790 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
267a0 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
267b0 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
267c0 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
267d0 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
267e0 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
267f0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  . .        ** If
26800 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
26810 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
26820 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
26830 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
26840 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64         ** add vd
26850 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
26860 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
26870 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
26880 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
26890 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
268a0 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
268b0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
268c0 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
268d0 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
268e0 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
268f0 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
26900 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
26910 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a  imum .        **
26920 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
26930 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
26940 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ed)..        **.
26950 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65          ** A spe
26960 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
26970 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
26980 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
26990 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
269a0 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
269b0 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f  haviour as follo
269c0 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ws:.        **. 
269d0 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66         **   + If
269e0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
269f0 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c  "SELECT min(x)",
26a00 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63   then the loop c
26a10 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20  oded by.        
26a20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
26a30 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
26a40 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
26a50 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
26a60 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  lue.        **  
26a70 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20     for x..      
26a80 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26a90 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65    + The optimize
26aa0 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  r code in where.
26ab0 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  c (the thing tha
26ac0 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a  t decides which.
26ad0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
26ae0 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20  ndex or indices 
26af0 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70  to use) should p
26b00 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
26b10 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20   priority on .  
26b20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74        **     sat
26b30 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44  isfying the 'ORD
26b40 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68  ER BY' clause th
26b50 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74  an it does in ot
26b60 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20  her cases..     
26b70 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
26b80 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
26b90 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
26ba0 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
26bb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26bc0 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
26bd0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  x = 0;.        u
26be0 38 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51  8 flag = minMaxQ
26bf0 75 65 72 79 28 70 29 3b 0a 20 20 20 20 20 20 20  uery(p);.       
26c00 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
26c10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
26c20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26c30 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
26c40 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
26c50 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
26c60 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69    pMinMax = sqli
26c70 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
26c80 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  b, p->pEList->a[
26c90 30 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  0].pExpr->x.pLis
26ca0 74 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t,0);.          
26cb0 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a  pDel = pMinMax;.
26cc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
26cd0 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61  inMax && !db->ma
26ce0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
26cf0 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
26d00 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  x->a[0].sortOrde
26d10 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f  r = flag!=WHERE_
26d20 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30  ORDERBY_MIN ?1:0
26d30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
26d40 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70  inMax->a[0].pExp
26d50 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
26d60 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  N;.          }. 
26d70 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
26d80 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
26d90 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
26da0 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
26db0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
26dc0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
26dd0 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
26de0 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
26df0 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
26e00 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
26e10 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
26e20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26e30 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
26e40 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
26e50 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
26e60 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
26e70 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
26e80 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
26e90 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20  here, &pMinMax, 
26ea0 30 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20  0, flag);.      
26eb0 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
26ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
26ed0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
26ee0 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
26ef0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
26f00 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
26f10 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74   }.        updat
26f20 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
26f30 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
26f40 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4d  .        if( !pM
26f50 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b  inMax && flag ){
26f60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26f70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26f80 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e  OP_Goto, 0, pWIn
26f90 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20  fo->iBreak);.   
26fa0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
26fb0 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20  nt((v, "%s() by 
26fc0 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20  index",.        
26fd0 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57          (flag==W
26fe0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
26ff0 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b  ?"min":"max")));
27000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27010 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
27020 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
27030 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
27040 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
27050 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
27060 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64     }..      pOrd
27070 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
27080 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27090 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
270a0 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c  ng, addrEnd, SQL
270b0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
270c0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
270d0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
270e0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20  , p->pEList, 0, 
270f0 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20  0, 0, -1, .     
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27110 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c   pDest, addrEnd,
27120 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
27130 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
27140 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
27150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
27160 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
27170 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
27180 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
27190 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
271a0 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 64 69 73  ry */..  if( dis
271b0 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
271c0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
271d0 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
271e0 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  CT");.  }..  /* 
271f0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
27200 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
27210 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
27220 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
27230 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
27240 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
27250 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
27260 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
27270 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  rBy ){.    expla
27280 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
27290 73 65 2c 20 22 4f 52 44 45 52 20 42 59 22 29 3b  se, "ORDER BY");
272a0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
272b0 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
272c0 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   v, pEList->nExp
272d0 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
272e0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
272f0 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
27300 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
27310 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
27320 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
27330 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
27340 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
27350 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
27360 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
27370 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
27380 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
27390 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
273a0 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
273b0 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
273c0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
273d0 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
273e0 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
273f0 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
27400 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
27410 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e  t_end:.  explain
27420 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
27430 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
27440 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
27450 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
27460 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
27470 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53  results of the S
27480 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20  ELECT are to be 
27490 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
274a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
274b0 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74   && pDest->eDest
274c0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
274d0 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
274e0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
274f0 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
27500 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
27510 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
27520 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
27530 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
27540 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
27550 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27560 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
27570 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
27580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
275a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
275b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
275c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
275d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
275e0 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ode is used for 
275f0 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
27600 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65  gging only.  The
27610 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f   code.** that fo
27620 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  llows does not a
27630 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20  ppear in normal 
27640 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  builds..**.** Th
27650 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
27660 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f   used to print o
27670 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
27680 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66  f all or part of
27690 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72   a .** parse str
276a0 75 63 74 75 72 65 73 20 73 75 63 68 20 61 73 20  uctures such as 
276b0 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20  Select or Expr. 
276c0 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20   Such printouts 
276d0 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f  are useful.** fo
276e0 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64  r helping to und
276f0 65 72 73 74 61 6e 64 20 77 68 61 74 20 69 73 20  erstand what is 
27700 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65  happening inside
27710 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
27720 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68  tor.** during th
27730 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63  e execution of c
27740 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74  omplex SELECT st
27750 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
27760 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72  These routine ar
27770 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79  e not called any
27780 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69  where from withi
27790 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20  n the normal.** 
277a0 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e  code base.  Then
277b0 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f   are intended to
277c0 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
277d0 77 69 74 68 69 6e 20 74 68 65 20 64 65 62 75 67  within the debug
277e0 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74  ger.** or from t
277f0 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66  emporary "printf
27800 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  " statements ins
27810 65 72 74 65 64 20 66 6f 72 20 64 65 62 75 67 67  erted for debugg
27820 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ing..*/.void sql
27830 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45 78  ite3PrintExpr(Ex
27840 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 45  pr *p){.  if( !E
27850 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
27860 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
27870 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
27880 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
27890 67 50 72 69 6e 74 66 28 22 28 25 73 22 2c 20 70  gPrintf("(%s", p
278a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d  ->u.zToken);.  }
278b0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
278c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25  3DebugPrintf("(%
278d0 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a  d", p->op);.  }.
278e0 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29    if( p->pLeft )
278f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
27900 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20  ugPrintf(" ");. 
27910 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
27920 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  xpr(p->pLeft);. 
27930 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67   }.  if( p->pRig
27940 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
27950 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22  3DebugPrintf(" "
27960 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
27970 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68  intExpr(p->pRigh
27980 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
27990 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 22  3DebugPrintf(")"
279a0 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
279b0 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45  3PrintExprList(E
279c0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
279d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
279e0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
279f0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
27a00 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
27a10 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
27a20 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c  r);.    if( i<pL
27a30 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a  ist->nExpr-1 ){.
27a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
27a50 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a  ugPrintf(", ");.
27a60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64      }.  }.}.void
27a70 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
27a80 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
27a90 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71  nt indent){.  sq
27aa0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27ab0 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20  ("%*sSELECT(%p) 
27ac0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70  ", indent, "", p
27ad0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e  );.  sqlite3Prin
27ae0 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
27af0 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ist);.  sqlite3D
27b00 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
27b10 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
27b20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  ){.    char *zPr
27b30 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b  efix;.    int i;
27b40 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22  .    zPrefix = "
27b50 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69  FROM";.    for(i
27b60 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  =0; i<p->pSrc->n
27b70 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
27b80 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
27b90 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
27ba0 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  ->pSrc->a[i];.  
27bb0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
27bc0 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69  Printf("%*s ", i
27bd0 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78  ndent+6, zPrefix
27be0 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78  );.      zPrefix
27bf0 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28   = "";.      if(
27c00 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
27c10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27c20 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
27c30 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71  \n");.        sq
27c40 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
27c50 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  (pItem->pSelect,
27c60 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20   indent+10);.   
27c70 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
27c80 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20  gPrintf("%*s)", 
27c90 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20  indent+8, "");. 
27ca0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
27cb0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
27cc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
27cd0 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20  bugPrintf("%s", 
27ce0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
27cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27d00 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a   pItem->pTab ){.
27d10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
27d20 65 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62  ebugPrintf("(tab
27d30 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  le: %s)", pItem-
27d40 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pTab->zName);. 
27d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27d60 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
27d70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27d80 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41  3DebugPrintf(" A
27d90 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41  S %s", pItem->zA
27da0 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
27db0 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53       if( i<p->pS
27dc0 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20  rc->nSrc-1 ){.  
27dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
27de0 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20  ugPrintf(",");. 
27df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
27e00 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
27e10 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  "\n");.    }.  }
27e20 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
27e30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
27e40 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
27e50 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c  WHERE ", indent,
27e60 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
27e70 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57  3PrintExpr(p->pW
27e80 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
27e90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
27ea0 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
27eb0 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
27ec0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
27ed0 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20  intf("%*s GROUP 
27ee0 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  BY ", indent, ""
27ef0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
27f00 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
27f10 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
27f20 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27f30 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
27f40 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
27f50 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
27f60 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49  Printf("%*s HAVI
27f70 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  NG ", indent, ""
27f80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
27f90 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  intExpr(p->pHavi
27fa0 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
27fb0 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
27fc0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
27fd0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
27fe0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
27ff0 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59  tf("%*s ORDER BY
28000 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
28010 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
28020 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  tExprList(p->pOr
28030 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
28040 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
28050 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45  \n");.  }.}./* E
28060 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  nd of the struct
28070 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69  ure debug printi
28080 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  ng code.********
28090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
280a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
280b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
280c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
280d0 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
280e0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
280f0 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
28100 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a  (SQLITE_DEBUG) *
28110 2f 0a                                            /.