/ Hex Artifact Content
Login

Artifact d85d83c334a3842b47d14e0574acb5f531d5579a:


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 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
78c0: 6d 3b 0a 20 20 20 20 69 6e 74 20 70 74 61 62 32  m;.    int ptab2
78d0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
78e0: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
78f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
7900: 70 65 6e 50 73 65 75 64 6f 2c 20 70 74 61 62 32  penPseudo, ptab2
7910: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 70 4f  , regSortOut, pO
7920: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29  rderBy->nExpr+2)
7930: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  ;.    addr = 1 +
7940: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7950: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
7960: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
7970: 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f  reak);.    codeO
7980: 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64 72  ffset(v, p, addr
7990: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
79a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
79b0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
79c0: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
79d0: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
79e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
79f0: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74 61 62 32 2c  P_Column, ptab2,
7a00: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
7a10: 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20  +1, regRow);.   
7a20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7a30: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43  geP5(v, OPFLAG_C
7a40: 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 7d 65  LEARCACHE);.  }e
7a50: 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  lse{.    addr = 
7a60: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
7a70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
7a80: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
7a90: 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  k);.    codeOffs
7aa0: 65 74 28 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e  et(v, p, addrCon
7ab0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
7ac0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7ad0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
7ae0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
7af0: 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  r+1, regRow);.  
7b00: 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  }.  switch( eDes
7b10: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
7b20: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
7b30: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
7b40: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
7b50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
7b60: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
7b70: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7b80: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
7b90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ba0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
7bb0: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  wid, iParm, regR
7bc0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
7bd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7be0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
7bf0: 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  rm, regRow, regR
7c00: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
7c10: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
7c20: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
7c30: 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  D);.      break;
7c40: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
7c50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7c60: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
7c70: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
7c80: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
7c90: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
7ca0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
7cb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
7cc0: 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69  gRow, 1, regRowi
7cd0: 64 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c  d, &p->affinity,
7ce0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
7cf0: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
7d00: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
7d10: 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20  , regRow, 1);.  
7d20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7d30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
7d40: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
7d50: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62  gRowid);.      b
7d60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7d70: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
7d80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
7d90: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
7da0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
7db0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
7dc0: 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b  gRow, iParm, 1);
7dd0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
7de0: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
7df0: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
7e00: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
7e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7e20: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
7e30: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lt: {.      int 
7e40: 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  i;.      assert(
7e50: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
7e60: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
7e70: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20  _Coroutine ); . 
7e80: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
7e90: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
7ea0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7eb0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
7ec0: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
7ed0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
7ee0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
7ef0: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52      assert( regR
7f00: 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b  ow!=pDest->iMem+
7f10: 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i );.        sql
7f20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7f30: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65  , OP_Column, pse
7f40: 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74  udoTab, i, pDest
7f50: 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20  ->iMem+i);.     
7f60: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
7f70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7f80: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
7f90: 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
7fa0: 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  E);.        }.  
7fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7fc0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
7fd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
7fe0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7ff0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
8000: 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f  pDest->iMem, nCo
8010: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
8020: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8030: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8040: 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65  arse, pDest->iMe
8050: 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  m, nColumn);.   
8060: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8070: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8080: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
8090: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
80a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
80b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
80c0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
80d0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
80e0: 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65  egRow);.  sqlite
80f0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
8100: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
8110: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74  );..  /* The bot
8120: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
8130: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
8140: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
8150: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
8160: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
8170: 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72 74 65  gs & SF_UseSorte
8180: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
8190: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
81a0: 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61  _SorterNext, iTa
81b0: 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d 65 6c 73  b, addr);.  }els
81c0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
81d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
81e0: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
81f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
8200: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
8210: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  v, addrBreak);. 
8220: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
8230: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
8240: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
8250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
8260: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
8270: 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ose, pseudoTab, 
8280: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
8290: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
82a0: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
82b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
82c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
82d0: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
82e0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
82f0: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
8300: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
8310: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
8320: 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61  *.** The declara
8330: 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65  tion type is the
8340: 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20   exact datatype 
8350: 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61  definition extra
8360: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  cted from the.**
8370: 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45   original CREATE
8380: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8390: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
83a0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
83b0: 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69  The.** declarati
83c0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f  on type for a RO
83d0: 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54  WID field is INT
83e0: 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68  EGER. Exactly wh
83f0: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
8400: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
8410: 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  d a column can b
8420: 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65  e complex in the
8430: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62   presence of sub
8440: 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20  queries. The.** 
8450: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
8460: 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20  ssion in all of 
8470: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45  the following SE
8480: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
8490: 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  is .** considere
84a0: 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68  d a column by th
84b0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
84c0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20  **   SELECT col 
84d0: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
84e0: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
84f0: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
8500: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
8510: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  col FROM tbl);.*
8520: 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46  *   SELECT abc F
8530: 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ROM (SELECT col 
8540: 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29  AS abc FROM tbl)
8550: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63  ;.** .** The dec
8560: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
8570: 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  r any expression
8580: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
8590: 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  lumn is NULL..*/
85a0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
85b0: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a  ar *columnType(.
85c0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
85d0: 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  NC, .  Expr *pEx
85e0: 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pr,.  const char
85f0: 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20   **pzOriginDb,. 
8600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
8610: 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e  OriginTab,.  con
8620: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
8630: 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20  inCol.){.  char 
8640: 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30  const *zType = 0
8650: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
8660: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20  zOriginDb = 0;. 
8670: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
8680: 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63  iginTab = 0;.  c
8690: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
86a0: 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  inCol = 0;.  int
86b0: 20 6a 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   j;.  if( NEVER(
86c0: 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43  pExpr==0) || pNC
86d0: 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ->pSrcList==0 ) 
86e0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69  return 0;..  swi
86f0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
8700: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
8710: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
8720: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
8730: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
8740: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
8750: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
8760: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
8770: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
8780: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
8790: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
87a0: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
87b0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
87c0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
87d0: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
87e0: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
87f0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
8800: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
8810: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
8820: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
8830: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
8840: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
8850: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
8860: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
8870: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
8880: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
8890: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
88a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
88b0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
88c0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
88d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
88e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
88f0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
8900: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
8910: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
8920: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
8930: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
8940: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
8950: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
8960: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
8970: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
8980: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
8990: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
89a0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
89b0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
89c0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
89d0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
89e0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
89f0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
8a00: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
8a10: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
8a20: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
8a30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8a40: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
8a50: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
8a60: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
8a70: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
8a80: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
8a90: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
8aa0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
8ab0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
8ac0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
8ad0: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
8ae0: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
8af0: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
8b00: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
8b10: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
8b20: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
8b30: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
8b40: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
8b50: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
8b60: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
8b70: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
8b80: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
8b90: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
8ba0: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
8bb0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
8bc0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
8bd0: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
8be0: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
8bf0: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
8c00: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
8c10: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
8c20: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
8c30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
8c40: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
8c50: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
8c60: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
8c70: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
8c80: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
8c90: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
8ca0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
8cb0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
8cc0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
8cd0: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
8ce0: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
8cf0: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
8d00: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
8d10: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
8d20: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
8d30: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
8d40: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
8d50: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
8d60: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
8d70: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
8d80: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
8d90: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
8da0: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
8db0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
8dc0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
8dd0: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
8de0: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
8df0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
8e00: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
8e10: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
8e20: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
8e30: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
8e40: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
8e50: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
8e60: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
8e70: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
8e80: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
8e90: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
8ea0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
8eb0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
8ec0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
8ed0: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
8ee0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
8ef0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
8f00: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
8f10: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
8f20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
8f30: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57  ( iCol>=0 && ALW
8f40: 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c  AYS(iCol<pS->pEL
8f50: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
8f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
8f70: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
8f80: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
8f90: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
8fa0: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
8fb0: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
8fc0: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
8fd0: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
8fe0: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
8ff0: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
9000: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
9010: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
9020: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
9030: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
9040: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d  */.          Nam
9050: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
9060: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
9070: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
9080: 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20  iCol].pExpr;.   
9090: 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c         sNC.pSrcL
90a0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
90b0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e            sNC.pN
90c0: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
90d0: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
90e0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
90f0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
9100: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
9110: 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c  , p, &zOriginDb,
9120: 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a   &zOriginTab, &z
9130: 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20  OriginCol); .   
9140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
9150: 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 54  se if( ALWAYS(pT
9160: 61 62 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a  ab->pSchema) ){.
9170: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
9180: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  l table */.     
9190: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29     assert( !pS )
91a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
91b0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
91c0: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
91d0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
91e0: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
91f0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
9200: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ol) );.        i
9210: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
9220: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
9230: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
9240: 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d      zOriginCol =
9250: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
9260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9270: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
9280: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
9290: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e;.          zOr
92a0: 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  iginCol = pTab->
92b0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
92c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
92d0: 20 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d      zOriginTab =
92e0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
92f0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70        if( pNC->p
9300: 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Parse ){.       
9310: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
9320: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
9330: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
9340: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
9350: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
9360: 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50  iginDb = pNC->pP
9370: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
9380: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
9390: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
93a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
93b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
93c0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
93d0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
93e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
93f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
9400: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
9410: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
9420: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
9430: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
9440: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
9450: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
9460: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
9470: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
9480: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
9490: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
94a0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
94b0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
94c0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
94d0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
94e0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
94f0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
9500: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
9510: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
9520: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
9530: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
9540: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
9550: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
9560: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
9570: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
9580: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
9590: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
95a0: 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c  , p, &zOriginDb,
95b0: 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a   &zOriginTab, &z
95c0: 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20  OriginCol); .   
95d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
95e0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20  #endif.  }.  .  
95f0: 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29  if( pzOriginDb )
9600: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a  {.    assert( pz
9610: 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f  OriginTab && pzO
9620: 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  riginCol );.    
9630: 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f  *pzOriginDb = zO
9640: 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a  riginDb;.    *pz
9650: 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69  OriginTab = zOri
9660: 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f  ginTab;.    *pzO
9670: 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67  riginCol = zOrig
9680: 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  inCol;.  }.  ret
9690: 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a  urn zType;.}../*
96a0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
96b0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
96c0: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65   the VDBE the de
96d0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20  claration types 
96e0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
96f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
9700: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9710: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
9720: 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pes(.  Parse *pP
9730: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
9740: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
9750: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
9760: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
9770: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
9780: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
9790: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
97a0: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
97b0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69  ult set */.){.#i
97c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
97d0: 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62  T_DECLTYPE.  Vdb
97e0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
97f0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
9800: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
9810: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
9820: 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73   = pTabList;.  s
9830: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
9840: 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  se;.  for(i=0; i
9850: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
9860: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
9870: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
9880: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
9890: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23  t char *zType;.#
98a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
98b0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
98c0: 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ATA.    const ch
98d0: 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  ar *zOrigDb = 0;
98e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
98f0: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
9900: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9910: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  OrigCol = 0;.   
9920: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
9930: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
9940: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
9950: 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20  , &zOrigCol);.. 
9960: 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d     /* The vdbe m
9970: 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e  ust make its own
9980: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
9990: 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68  umn-type and oth
99a0: 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  er .    ** colum
99b0: 6e 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e  n specific strin
99c0: 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  gs, in case the 
99d0: 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20  schema is reset 
99e0: 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20  before this.    
99f0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
9a00: 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20  ne is deleted.. 
9a10: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
9a20: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
9a30: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41  v, i, COLNAME_DA
9a40: 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c  TABASE, zOrigDb,
9a50: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
9a60: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
9a70: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9a80: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c   i, COLNAME_TABL
9a90: 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c  E, zOrigTab, SQL
9aa0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
9ab0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
9ac0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
9ad0: 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20  COLNAME_COLUMN, 
9ae0: 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45  zOrigCol, SQLITE
9af0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c  _TRANSIENT);.#el
9b00: 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  se.    zType = c
9b10: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
9b20: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  p, 0, 0, 0);.#en
9b30: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dif.    sqlite3V
9b40: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9b50: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c   i, COLNAME_DECL
9b60: 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c  TYPE, zType, SQL
9b70: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
9b80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
9b90: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
9ba0: 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  PE */.}../*.** G
9bb0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
9bc0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
9bd0: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
9be0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
9bf0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
9c00: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
9c10: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
9c20: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
9c30: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
9c40: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
9c50: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
9c60: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
9c70: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9c80: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
9c90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
9ca0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
9cb0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
9cc0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
9cd0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
9ce0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
9cf0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
9d00: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
9d10: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
9d20: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
9d30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9d40: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
9d50: 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f  t fullNames, sho
9d60: 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65  rtNames;..#ifnde
9d70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
9d80: 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
9d90: 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
9da0: 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
9db0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
9dc0: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
9dd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
9de0: 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73  dif..  if( pPars
9df0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
9e00: 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c  | NEVER(v==0) ||
9e10: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9e20: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50  d ) return;.  pP
9e30: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
9e40: 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
9e50: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
9e60: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
9e70: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f  Names)!=0;.  sho
9e80: 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  rtNames = (db->f
9e90: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
9ea0: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ortColNames)!=0;
9eb0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
9ec0: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
9ed0: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
9ee0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
9ef0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
9f00: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70    Expr *p;.    p
9f10: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
9f20: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e  pExpr;.    if( N
9f30: 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e  EVER(p==0) ) con
9f40: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
9f50: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
9f60: 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
9f70: 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  *zName = pEList-
9f80: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
9f90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9fa0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
9fb0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
9fc0: 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  me, SQLITE_TRANS
9fd0: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
9fe0: 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f   if( (p->op==TK_
9ff0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d  COLUMN || p->op=
a000: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
a010: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
a020: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
a030: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
a040: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
a050: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
a060: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
a070: 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73  ALWAYS(j<pTabLis
a080: 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a  t->nSrc); j++){.
a090: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
a0a0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
a0b0: 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20  or==p->iTable ) 
a0c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a0d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
a0e0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
a0f0: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
a100: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
a110: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
a120: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
a130: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
a140: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
a150: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
a160: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
a170: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
a180: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
a190: 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  zCol = "rowid";.
a1a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a1b0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
a1c0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
a1d0: 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
a1e0: 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65    if( !shortName
a1f0: 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20  s && !fullNames 
a200: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a210: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
a220: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
a230: 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  AME, .          
a240: 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75    sqlite3DbStrDu
a250: 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
a260: 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54  i].zSpan), SQLIT
a270: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
a280: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c    }else if( full
a290: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
a2a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
a2b0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
a2c0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
a2d0: 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  (db, "%s.%s", pT
a2e0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ab->zName, zCol)
a2f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a300: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
a310: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
a320: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
a330: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
a340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a350: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
a360: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
a370: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c  NAME_NAME, zCol,
a380: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
a390: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
a3a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
a3b0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a3c0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a3d0: 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20  _NAME, .        
a3e0: 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75    sqlite3DbStrDu
a3f0: 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
a400: 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54  i].zSpan), SQLIT
a410: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
a420: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
a430: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
a440: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
a450: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
a460: 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65  Given a an expre
a470: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
a480: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
a490: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
a4a0: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
a4b0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a4c0: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
a4d0: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
a4e0: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
a4f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
a500: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
a510: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
a520: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
a530: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
a540: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
a550: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
a560: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
a570: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
a580: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
a590: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
a5a0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
a5b0: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
a5c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
a5d0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
a5e0: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
a5f0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
a600: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
a610: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
a620: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
a630: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
a640: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
a650: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
a660: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
a670: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
a680: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
a690: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
a6a0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
a6b0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
a6c0: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
a6d0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
a6e0: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
a6f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c  */.  int *pnCol,
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a710: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
a720: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
a730: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
a740: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
a750: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
a760: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
a770: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
a780: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a790: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
a7a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
a7b0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a7d0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
a7e0: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a800: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
a810: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
a820: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
a830: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
a840: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
a850: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
a860: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
a870: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
a880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a890: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
a8a0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
a8b0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20   */.  Expr *p;  
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8d0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
a8e0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73  for a single res
a8f0: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
a900: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
a910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
a920: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
a930: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
a940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a950: 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a  ize of name in z
a960: 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 2a 70 6e  Name[] */..  *pn
a970: 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70 45 4c  Col = nCol = pEL
a980: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 43  ist->nExpr;.  aC
a990: 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d 20 73 71  ol = *paCol = sq
a9a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
a9b0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
a9c0: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69  l[0])*nCol);.  i
a9d0: 66 28 20 61 43 6f 6c 3d 3d 30 20 29 20 72 65 74  f( aCol==0 ) ret
a9e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
a9f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
aa00: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  l=aCol; i<nCol; 
aa10: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
aa20: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
aa30: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
aa40: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
aa50: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
aa60: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
aa70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
aa80: 69 67 68 74 3d 3d 30 20 7c 7c 20 45 78 70 72 48  ight==0 || ExprH
aa90: 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 52  asProperty(p->pR
aaa0: 69 67 68 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ight, EP_IntValu
aab0: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e).             
aac0: 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e    || p->pRight->
aad0: 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 20 7c 7c 20 70  u.zToken==0 || p
aae0: 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  ->pRight->u.zTok
aaf0: 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
ab00: 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c  if( (zName = pEL
ab10: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
ab20: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
ab30: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
ab40: 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e  ntains an "AS <n
ab50: 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73  ame>" phrase, us
ab60: 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20  e <name> as the 
ab70: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
ab80: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
ab90: 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29  trDup(db, zName)
aba0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
abb0: 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70     Expr *pColExp
abc0: 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65  r = p;  /* The e
abd0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
abe0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  s the result col
abf0: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
ac00: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
ac10: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
ac20: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ac30: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
ac40: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
ac50: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
ac60: 5f 44 4f 54 20 29 20 70 43 6f 6c 45 78 70 72 20  _DOT ) pColExpr 
ac70: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
ac80: 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ht;.      if( pC
ac90: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  olExpr->op==TK_C
aca0: 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28  OLUMN && ALWAYS(
acb0: 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d  pColExpr->pTab!=
acc0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0) ){.        /*
acd0: 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65   For columns use
ace0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
acf0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
ad00: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c   int iCol = pCol
ad10: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
ad20: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 43         pTab = pC
ad30: 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20  olExpr->pTab;.  
ad40: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
ad50: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
ad60: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a  iPKey;.        z
ad70: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
ad80: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a  rintf(db, "%s",.
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ada0: 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d   iCol>=0 ? pTab-
adb0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
adc0: 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20  e : "rowid");.  
add0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
ade0: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  olExpr->op==TK_I
adf0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  D ){.        ass
ae00: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
ae10: 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20  perty(pColExpr, 
ae20: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
ae30: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ae40: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
ae50: 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45 78 70  b, "%s", pColExp
ae60: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
ae70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ae80: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
ae90: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
aea0: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
aeb0: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
aec0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   */.        zNam
aed0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
aee0: 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c  tf(db, "%s", pEL
aef0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
af00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
af10: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
af20: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
af30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
af40: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
af50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
af60: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
af70: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
af80: 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
af90: 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
afa0: 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
afb0: 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20  ppend a integer 
afc0: 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
afd0: 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
afe0: 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
aff0: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
b000: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
b010: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d  ;.    for(j=cnt=
b020: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
b030: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
b040: 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a  trICmp(aCol[j].z
b050: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
b060: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
b070: 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20  *zNewName;.     
b080: 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20     zName[nName] 
b090: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65  = 0;.        zNe
b0a0: 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  wName = sqlite3M
b0b0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25  Printf(db, "%s:%
b0c0: 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74  d", zName, ++cnt
b0d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b0e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
b0f0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  me);.        zNa
b100: 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20  me = zNewName;. 
b110: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
b120: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
b130: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b140: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
b150: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
b160: 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  me;.  }.  if( db
b170: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b180: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
b190: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
b1a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b1b0: 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  , aCol[j].zName)
b1c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b1d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
b1e0: 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20  ol);.    *paCol 
b1f0: 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20  = 0;.    *pnCol 
b200: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
b210: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b220: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
b230: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
b240: 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  dd type and coll
b250: 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
b260: 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69  n to a column li
b270: 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  st based on.** a
b280: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b290: 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  t..** .** The co
b2a0: 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d  lumn list presum
b2b0: 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73  ably came from s
b2c0: 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  electColumnNames
b2d0: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a  FromExprList()..
b2e0: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
b2f0: 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65  st has only name
b300: 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20  s, not types or 
b310: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69  collations.  Thi
b320: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65  s.** routine goe
b330: 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64  s through and ad
b340: 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64  ds the types and
b350: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   collations..**.
b360: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b370: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c  requires that al
b380: 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e  l identifiers in
b390: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73   the SELECT.** s
b3a0: 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f  tatement be reso
b3b0: 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lved..*/.static 
b3c0: 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f  void selectAddCo
b3d0: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
b3e0: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
b3f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
b400: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b410: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c  s */.  int nCol,
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b430: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
b440: 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  s */.  Column *a
b450: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Col,         /* 
b460: 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
b470: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
b480: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
b490: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
b4a0: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
b4b0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
b4c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
b4d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
b4e0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
b4f0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
b500: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
b510: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
b520: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
b530: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
b540: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
b550: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
b560: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
b570: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
b580: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
b590: 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65  ssert( nCol==pSe
b5a0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
b5b0: 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
b5c0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
b5d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b5e0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  d ) return;.  me
b5f0: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
b600: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
b610: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  C.pSrcList = pSe
b620: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20  lect->pSrc;.  a 
b630: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
b640: 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  t->a;.  for(i=0,
b650: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
b660: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
b670: 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  {.    p = a[i].p
b680: 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Expr;.    pCol->
b690: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44  zType = sqlite3D
b6a0: 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75  bStrDup(db, colu
b6b0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
b6c0: 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70  0, 0, 0));.    p
b6d0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
b6e0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
b6f0: 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ity(p);.    if( 
b700: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
b710: 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  0 ) pCol->affini
b720: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
b730: 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  NONE;.    pColl 
b740: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
b750: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
b760: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
b770: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
b780: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
b790: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
b7a0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
b7b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
b7c0: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
b7d0: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
b7e0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
b7f0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
b800: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
b810: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
b820: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
b830: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
b840: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
b850: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
b860: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
b870: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
b880: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b890: 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
b8a0: 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
b8b0: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
b8c0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
b8d0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
b8e0: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
b8f0: 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
b900: 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
b910: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
b920: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
b930: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
b940: 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
b950: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
b960: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
b970: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
b980: 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
b990: 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
b9a0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
b9b0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
b9c0: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
b9d0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
b9e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
b9f0: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71  .  }.  /* The sq
ba00: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
ba10: 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79  Select() is only
ba20: 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73   used n contexts
ba30: 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65   where lookaside
ba40: 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
ba50: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  d */.  assert( d
ba60: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
ba70: 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54  abled==0 );.  pT
ba80: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
ba90: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  pTab->zName = 0;
baa0: 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  .  pTab->nRowEst
bab0: 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 73 65   = 1000000;.  se
bac0: 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
bad0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
bae0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c  pSelect->pEList,
baf0: 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
bb00: 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65  Tab->aCol);.  se
bb10: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
bb20: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
bb30: 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
bb40: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
bb50: 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
bb60: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
bb70: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
bb80: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
bb90: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
bba0: 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
bbb0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
bbc0: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
bbd0: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
bbe0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
bbf0: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
bc00: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
bc10: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
bc20: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
bc30: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
bc40: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
bc50: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
bc60: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
bc70: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
bc80: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
bc90: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
bca0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
bcb0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
bcc0: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dbe = sqlite3Vdb
bcd0: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e  eCreate(pParse->
bce0: 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  db);.#ifndef SQL
bcf0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
bd00: 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20     if( v ){.    
bd10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bd20: 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29  Op0(v, OP_Trace)
bd30: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
bd40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
bd50: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
bd60: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
bd70: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
bd80: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
bd90: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
bda0: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
bdb0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
bdc0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
bdd0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
bde0: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
bdf0: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
be00: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
be10: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
be20: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
be30: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
be40: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
be50: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
be60: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
be70: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
be80: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
be90: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
bea0: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
beb0: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
bec0: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
bed0: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
bee0: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
bef0: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
bf00: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
bf10: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
bf20: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
bf30: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
bf40: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
bf50: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
bf60: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
bf70: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
bf80: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
bf90: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
bfa0: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
bfb0: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
bfc0: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
bfd0: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
bfe0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
bff0: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
c000: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
c010: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
c020: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
c030: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
c040: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
c050: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
c060: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
c070: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
c080: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
c090: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
c0a0: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
c0b0: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
c0c0: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
c0d0: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
c0e0: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
c0f0: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
c100: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
c110: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
c120: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
c130: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
c140: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
c150: 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
c160: 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
c170: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
c180: 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  et;.  int addr1,
c190: 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   n;.  if( p->iLi
c1a0: 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
c1b0: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
c1c0: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
c1d0: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
c1e0: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
c1f0: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
c200: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
c210: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
c220: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
c230: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
c240: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
c250: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
c260: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
c270: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
c280: 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
c290: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
c2a0: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
c2b0: 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20  || p->pLimit!=0 
c2c0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  );.  if( p->pLim
c2d0: 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69  it ){.    p->iLi
c2e0: 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
c2f0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
c300: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
c310: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c320: 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d     if( NEVER(v==
c330: 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
c340: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 68 61 76   VDBE should hav
c350: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
c360: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20  llocated */.    
c370: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
c380: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d  sInteger(p->pLim
c390: 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  it, &n) ){.     
c3a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c3b0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
c3c0: 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  , n, iLimit);.  
c3d0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
c3e0: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
c3f0: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  er"));.      if(
c400: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
c410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c420: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
c430: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
c440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c450: 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
c460: 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e 20 29 20  w > (double)n ) 
c470: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
c480: 28 64 6f 75 62 6c 65 29 6e 3b 0a 20 20 20 20 20  (double)n;.     
c490: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
c4a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c4b0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
c4c0: 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  Limit, iLimit);.
c4d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c4e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
c4f0: 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
c500: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
c510: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
c520: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
c530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c540: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
c550: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
c560: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c570: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
c580: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
c590: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
c5a0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
c5b0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
c5c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
c5d0: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
c5e0: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
c5f0: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
c600: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
c610: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
c620: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
c630: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c640: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
c650: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
c660: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c670: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
c680: 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r"));.      addr
c690: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
c6a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
c6b0: 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  s, iOffset);.   
c6c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c6d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
c6e0: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
c6f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c700: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c710: 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dr1);.      sqli
c720: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c730: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
c740: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
c750: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
c760: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
c770: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
c780: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
c790: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c7a0: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69   OP_IfPos, iLimi
c7b0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c7c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c7d0: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69  P_Integer, -1, i
c7e0: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
c7f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c800: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
c810: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
c820: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c830: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
c840: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
c850: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
c860: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
c870: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
c880: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
c890: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
c8a0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
c8b0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
c8c0: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
c8d0: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
c8e0: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
c8f0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
c900: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
c910: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
c920: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
c930: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
c940: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
c950: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
c960: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
c970: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
c980: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
c990: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
c9a0: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
c9b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c9c0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
c9d0: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
c9e0: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
c9f0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
ca00: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
ca10: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ca20: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
ca30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ca40: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
ca50: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
ca60: 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ;.  if( pRet==0 
ca70: 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  && iCol<p->pELis
ca80: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
ca90: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
caa0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
cab0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
cac0: 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
cad0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
cae0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
caf0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
cb00: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46  _SELECT */../* F
cb10: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
cb20: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
cb30: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
cb40: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
cb50: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
cb60: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
cb70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
cb80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
cb90: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
cba0: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
cbb0: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
cbc0: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
cbd0: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
cbe0: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
cbf0: 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  .);...#ifndef SQ
cc00: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
cc10: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
cc20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
cc30: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
cc40: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
cc50: 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
cc60: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
cc70: 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
cc80: 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
cc90: 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
cca0: 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
ccb0: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
ccc0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
ccd0: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
cce0: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
ccf0: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
cd00: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
cd10: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
cd20: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
cd30: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
cd40: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
cd50: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
cd60: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
cd70: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
cd80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
cd90: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
cda0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
cdb0: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
cdc0: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
cdd0: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
cde0: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
cdf0: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
ce00: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
ce10: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
ce20: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
ce30: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
ce40: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
ce50: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
ce60: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
ce70: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
ce80: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
ce90: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
cea0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
ceb0: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
cec0: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
ced0: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
cee0: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
cef0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
cf00: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
cf10: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
cf20: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
cf30: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
cf40: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
cf50: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
cf60: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
cf70: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
cf80: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
cf90: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
cfa0: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
cfb0: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
cfc0: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
cfd0: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
cfe0: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
cff0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
d000: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
d010: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
d020: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
d030: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
d040: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
d050: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
d060: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
d070: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
d080: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
d090: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
d0a0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
d0b0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d0c0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
d0d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d0e0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
d0f0: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
d100: 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
d110: 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
d120: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
d130: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
d140: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
d150: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
d160: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
d170: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
d180: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
d190: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
d1a0: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
d1b0: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
d1c0: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
d1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
d1e0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d1f0: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
d200: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
d210: 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
d220: 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
d230: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
d240: 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
d250: 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
d260: 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
d270: 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
d280: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
d290: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
d2a0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
d2b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d2c0: 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
d2d0: 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
d2e0: 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
d2f0: 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
d300: 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
d310: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
d320: 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
d330: 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
d340: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
d350: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
d360: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
d370: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
d380: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
d390: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
d3a0: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
d3b0: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
d3c0: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
d3d0: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
d3e0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
d3f0: 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
d400: 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
d410: 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
d420: 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20  is much */.  db 
d430: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
d440: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
d450: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
d460: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
d470: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
d480: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
d490: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
d4a0: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73  ghtmost );.  des
d4b0: 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
d4c0: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
d4d0: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
d4e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d4f0: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
d500: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
d510: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
d520: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
d530: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
d540: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d550: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d560: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
d570: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
d580: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d590: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
d5a0: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
d5b0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
d5c0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
d5d0: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
d5e0: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
d5f0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
d600: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d610: 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
d620: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
d630: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
d640: 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
d650: 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
d660: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
d670: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
d680: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
d690: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
d6a0: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
d6b0: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
d6c0: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
d6d0: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
d6e0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
d6f0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
d700: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d710: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
d720: 65 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70 45  est.iParm, p->pE
d730: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
d740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
d750: 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
d760: 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64  NORDERED);.    d
d770: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
d780: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
d790: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
d7a0: 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
d7b0: 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
d7c0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
d7d0: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
d7e0: 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
d7f0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
d800: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
d810: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
d820: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
d830: 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72  t->nExpr!=pPrior
d840: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
d850: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d860: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d870: 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
d880: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
d890: 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
d8a0: 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
d8b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
d8c0: 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
d8d0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
d8e0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
d8f0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d900: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
d910: 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
d920: 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
d930: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
d940: 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
d950: 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
d960: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
d970: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
d980: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
d990: 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
d9a0: 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  st);.  }..  /* G
d9b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
d9c0: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
d9d0: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
d9e0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
d9f0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
da00: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
da10: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
da20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
da30: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
da40: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
da50: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
da60: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
da70: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
da80: 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
da90: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
daa0: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
dab0: 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
dac0: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
dad0: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
dae0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
daf0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
db00: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dest);.      p->
db10: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
db20: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
db30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
db40: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
db50: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
db60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
db70: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
db80: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
db90: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
dba0: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
dbb0: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
dbc0: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
dbd0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
dbe0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
dbf0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
dc00: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
dc10: 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  mit);.        Vd
dc20: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
dc30: 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
dc40: 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
dc50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
dc60: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
dc70: 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
dc80: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
dc90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dca0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
dcb0: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
dcc0: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
dcd0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
dce0: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
dcf0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
dd00: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
dd10: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
dd20: 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
dd30: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
dd40: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
dd50: 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
dd60: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
dd70: 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
dd80: 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
dd90: 20 20 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74     && p->nSelect
dda0: 52 6f 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e 4c  Row > (double)nL
ddb0: 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20  imit .      ){. 
ddc0: 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
ddd0: 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e  tRow = (double)n
dde0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
ddf0: 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
de00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
de10: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
de20: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
de30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
de40: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
de50: 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
de60: 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
de70: 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
de80: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
de90: 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
dea0: 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
deb0: 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
dec0: 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
ded0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
dee0: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
def0: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
df00: 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
df10: 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
df20: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
df30: 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
df40: 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
df50: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
df60: 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
df70: 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
df80: 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
df90: 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
dfa0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
dfb0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
dfc0: 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
dfd0: 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
dfe0: 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
dff0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
e000: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
e010: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
e020: 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
e030: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
e040: 3d 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57 41  =priorOp && ALWA
e050: 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26  YS(!p->pLimit &&
e060: 21 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a  !p->pOffset) ){.
e070: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
e080: 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
e090: 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
e0a0: 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
e0b0: 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
e0c0: 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
e0d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
e0e0: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
e0f0: 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20  t!=p );  /* Can 
e100: 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72 20  only happen for 
e110: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
e120: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
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 2a 2a 20 6f 66 20 61 20 33         ** of a 3
e150: 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d  -way or more com
e160: 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  pound */.       
e170: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d   assert( p->pLim
e180: 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  it==0 );      /*
e190: 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
e1a0: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
e1b0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
e1c0: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
e1d0: 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  =0 );     /* Not
e1e0: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
e1f0: 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
e200: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
e210: 62 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a  b = dest.iParm;.
e220: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e230: 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
e240: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
e250: 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
e260: 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
e270: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
e280: 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
e290: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
e2a0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
e2b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
e2c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e2d0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
e2e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72   );.        addr
e2f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e300: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
e310: 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
e320: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
e330: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
e340: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
e350: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
e360: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
e370: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70   addr;.        p
e380: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65  ->pRightmost->se
e390: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
e3a0: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
e3b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e3c0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
e3d0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
e3e0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
e3f0: 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
e400: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
e410: 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
e420: 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
e430: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
e440: 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
e450: 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
e460: 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
e470: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
e480: 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
e490: 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
e4a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e4b0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
e4c0: 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
e4d0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
e4e0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
e4f0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e500: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
e510: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
e520: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
e530: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
e540: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
e550: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
e560: 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
e570: 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
e580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
e590: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
e5a0: 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
e5b0: 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
e5c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e5d0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
e5e0: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
e5f0: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
e600: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
e610: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
e620: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
e630: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
e640: 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
e650: 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
e660: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
e670: 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
e680: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
e690: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
e6a0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
e6b0: 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
e6c0: 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
e6d0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
e6e0: 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  K );.      /* Qu
e6f0: 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
e700: 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
e710: 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
e720: 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
e730: 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
e740: 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
e750: 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
e760: 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
e770: 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
e780: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
e790: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
e7a0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44  derBy);.      pD
e7b0: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
e7c0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
e7d0: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
e7e0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
e7f0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
e800: 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20  >op==TK_UNION ) 
e810: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
e820: 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
e830: 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
e840: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
e850: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
e860: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
e870: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
e880: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
e890: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  t;.      p->iLim
e8a0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
e8b0: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >iOffset = 0;.. 
e8c0: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
e8d0: 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
e8e0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
e8f0: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
e900: 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
e910: 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
e920: 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
e930: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
e940: 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e   unionTab==dest.
e950: 69 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44  iParm || dest.eD
e960: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a  est!=priorOp );.
e970: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
e980: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
e990: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
e9a0: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
e9b0: 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
e9c0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
e9d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73  .        if( des
e9e0: 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
e9f0: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  put ){.         
ea00: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
ea10: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = p;.          w
ea20: 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
ea30: 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
ea40: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
ea50: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
ea60: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
ea70: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
ea80: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
ea90: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
eaa0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
eab0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
eac0: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
ead0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
eae0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63  el(v);.        c
eaf0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
eb00: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
eb10: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
eb20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eb30: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
eb40: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
eb50: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  k);.        iSta
eb60: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
eb70: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
eb80: 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
eb90: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
eba0: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
ebb0: 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73  ionTab, p->pELis
ebc0: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20    0, -1, &dest, 
ebf0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
ec00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ec10: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
ec20: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
ec30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ec40: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
ec50: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
ec60: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
ec70: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ec80: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
ec90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
eca0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ecb0: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
ecc0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ecd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ece0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
ecf0: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
ed00: 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
ed10: 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
ed20: 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
ed30: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
ed40: 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
ed50: 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
ed60: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
ed70: 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
ed80: 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
ed90: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
eda0: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
edb0: 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
edc0: 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
edd0: 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
ede0: 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
edf0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ee00: 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
ee10: 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
ee20: 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
ee30: 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
ee40: 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
ee50: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
ee60: 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
ee70: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
ee80: 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
ee90: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
eea0: 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
eeb0: 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
eec0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
eed0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
eee0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
eef0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
ef00: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
ef10: 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
ef20: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
ef30: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
ef40: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67  r;.      p->pRig
ef50: 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73  htmost->selFlags
ef60: 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
ef70: 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
ef80: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
ef90: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
efa0: 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
efb0: 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
efc0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
efd0: 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
efe0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
eff0: 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
f000: 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
f010: 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
f020: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
f030: 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
f040: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
f050: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
f060: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
f070: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
f080: 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
f090: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f0a0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
f0b0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
f0c0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
f0d0: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
f0e0: 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
f0f0: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
f100: 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
f110: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
f120: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f130: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
f140: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
f150: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
f160: 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
f170: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
f180: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
f190: 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
f1a0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
f1b0: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
f1c0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
f1d0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
f1e0: 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
f1f0: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
f200: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
f210: 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 50  intersectdest.iP
f220: 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20  arm = tab2;.    
f230: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
f240: 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
f250: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
f260: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
f270: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
f280: 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63  se, p, &intersec
f290: 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  tdest);.      te
f2a0: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
f2b0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
f2c0: 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
f2d0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
f2e0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
f2f0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
f300: 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53  ctRow>pPrior->nS
f310: 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
f320: 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
f330: 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
f340: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f350: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
f360: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
f370: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
f380: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
f390: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20  t = pOffset;..  
f3a0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
f3b0: 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
f3c0: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
f3d0: 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
f3e0: 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
f3f0: 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
f400: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
f410: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
f420: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
f430: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
f440: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
f450: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
f460: 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
f470: 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
f480: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
f490: 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
f4a0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
f4b0: 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
f4c0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
f4d0: 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
f4e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
f4f0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
f500: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
f510: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
f520: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
f530: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
f540: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
f550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f560: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f570: 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
f580: 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  ak);.      r1 = 
f590: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
f5a0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
f5b0: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
f5c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f5d0: 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
f5e0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
f5f0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
f600: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
f610: 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
f620: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
f630: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f640: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
f650: 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
f660: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
f670: 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
f680: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
f690: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f6a0: 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26          0, -1, &
f6b0: 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
f6c0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
f6d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
f6e0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
f6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f700: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
f710: 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
f720: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f730: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
f740: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
f750: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f760: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
f770: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
f780: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f790: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
f7a0: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
f7b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
f7c0: 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ..  explainCompo
f7d0: 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
f7e0: 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
f7f0: 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  , p->op!=TK_ALL)
f800: 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
f810: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
f820: 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a  ces used by .  *
f830: 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
f840: 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
f850: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
f860: 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
f870: 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
f880: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
f890: 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
f8a0: 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
f8b0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
f8c0: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
f8d0: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
f8e0: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
f8f0: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
f900: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
f910: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
f920: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
f930: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
f940: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
f950: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
f960: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
f970: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
f980: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
f990: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
f9a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
f9b0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
f9c0: 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  sEphemeral ){.  
f9d0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
fa00: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
fa10: 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
fa20: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
fa30: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
fa40: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
fa50: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f  .    Select *pLo
fa60: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
fa70: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
fa80: 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54  g through SELECT
fa90: 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
faa0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43     CollSeq **apC
fab0: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
fac0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
fad0: 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f  through pKeyInfo
fae0: 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  ->aColl[] */.   
faf0: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fb10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
fb20: 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
fb30: 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  t */..    assert
fb40: 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
fb50: 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  =p );.    nCol =
fb60: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
fb70: 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  r;.    pKeyInfo 
fb80: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
fb90: 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20  cZero(db,.      
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66   sizeof(*pKeyInf
fbc0: 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28  o)+nCol*(sizeof(
fbd0: 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b  CollSeq*) + 1));
fbe0: 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
fbf0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
fc00: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fc10: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
fc20: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
fc30: 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  }..    pKeyInfo-
fc40: 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
fc50: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46      pKeyInfo->nF
fc60: 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c  ield = (u16)nCol
fc70: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ;..    for(i=0, 
fc80: 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
fc90: 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
fca0: 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
fcb0: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
fcc0: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
fcd0: 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
fce0: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
fcf0: 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
fd00: 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
fd10: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
fd20: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
fd30: 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
fd40: 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
fd50: 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
fd60: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
fd70: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
fd80: 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
fd90: 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
fda0: 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
fdb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
fdc0: 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
fdd0: 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
fde0: 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
fdf0: 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
fe00: 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
fe10: 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
fe20: 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
fe30: 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
fe40: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
fe50: 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
fe60: 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
fe70: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
fe80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fe90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
fea0: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
feb0: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
fec0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
fed0: 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
fee0: 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
fef0: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
ff00: 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70     pLoop->addrOp
ff10: 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a  enEphm[i] = -1;.
ff20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ff30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ff40: 64 62 2c 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  db, pKeyInfo);. 
ff50: 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
ff60: 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69  _end:.  pDest->i
ff70: 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b  Mem = dest.iMem;
ff80: 0a 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d  .  pDest->nMem =
ff90: 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71   dest.nMem;.  sq
ffa0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
ffb0: 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a  e(db, pDelete);.
ffc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
ffd0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ffe0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
fff0: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  LECT */../*.** C
10000 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75  ode an output su
10010 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63  broutine for a c
10020 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65  oroutine impleme
10030 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20  ntation of a.** 
10040 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e  SELECT statment.
10050 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20  .**.** The data 
10060 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20  to be output is 
10070 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e  contained in pIn
10080 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 72 65 20 61  ->iMem.  There a
10090 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20  re.** pIn->nMem 
100a0 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75  columns to be ou
100b0 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20  tput.  pDest is 
100c0 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74  where the output
100d0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
100e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74  nt..**.** regRet
100f0 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  urn is the numbe
10100 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65  r of the registe
10110 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75  r holding the su
10120 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75  broutine.** retu
10130 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  rn address..**.*
10140 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74  * If regPrev>0 t
10150 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66 69  hen it is the fi
10160 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
10170 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a  a vector that.**
10180 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65   records the pre
10190 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d  vious output.  m
101a0 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61  em[regPrev] is a
101b0 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61   flag that is fa
101c0 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  lse.** if there 
101d0 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76  has been no prev
101e0 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66  ious output.  If
101f0 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
10200 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72  code is.** gener
10210 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73  ated to suppress
10220 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b   duplicates.  pK
10230 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66  eyInfo is used f
10240 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20  or comparing.** 
10250 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  keys..**.** If t
10260 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69  he LIMIT found i
10270 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72  n p->iLimit is r
10280 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d  eached, jump imm
10290 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69  ediately to.** i
102a0 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  Break..*/.static
102b0 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74   int generateOut
102c0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20  putSubroutine(. 
102d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
102e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
102f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10300 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10310 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10320 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10330 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
10340 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a   *pIn,        /*
10350 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c   Coroutine suppl
10360 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53  ying data */.  S
10370 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
10380 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ,      /* Where 
10390 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61  to send the data
103a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74   */.  int regRet
103b0 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  urn,          /*
103c0 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72   The return addr
103d0 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ess register */.
103e0 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20    int regPrev,  
103f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
10400 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67  vious result reg
10410 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75  ister.  No uniqu
10420 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20  eness if 0 */.  
10430 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
10440 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63  o,      /* For c
10450 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72  omparing with pr
10460 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a  evious entry */.
10470 20 20 69 6e 74 20 70 34 74 79 70 65 2c 20 20 20    int p4type,   
10480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10490 20 70 34 20 74 79 70 65 20 66 6f 72 20 70 4b 65   p4 type for pKe
104a0 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  yInfo */.  int i
104b0 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
104c0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
104d0 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
104e0 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
104f0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
10500 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
10510 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
10520 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
10530 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10540 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
10550 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
10560 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
10570 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
10580 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
10590 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
105a0 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
105b0 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
105c0 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
105d0 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
105e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
105f0 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29  _IfNot, regPrev)
10600 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74  ;.    j2 = sqlit
10610 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
10620 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
10630 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31  >iMem, regPrev+1
10640 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20  , pIn->nMem,.   
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
10670 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79  *)pKeyInfo, p4ty
10680 70 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pe);.    sqlite3
10690 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
106a0 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f  _Jump, j2+2, iCo
106b0 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20  ntinue, j2+2);. 
106c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
106d0 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
106e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
106f0 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70  deCopy(pParse, p
10700 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65  In->iMem, regPre
10710 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b  v+1, pIn->nMem);
10720 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10730 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10740 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76  eger, 1, regPrev
10750 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
10760 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
10770 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
10780 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
10790 20 74 68 65 20 74 68 65 20 66 69 72 73 74 20 4f   the the first O
107a0 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
107b0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
107c0 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
107d0 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
107e0 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  p, iContinue);..
107f0 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
10800 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
10810 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
10820 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
10830 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
10840 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
10850 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
10860 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
10870 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
10880 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
10890 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
108a0 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
108b0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
108c0 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  rse);.      test
108d0 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65  case( pDest->eDe
108e0 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
108f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10900 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
10910 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
10920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10930 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
10940 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d  eRecord, pIn->iM
10950 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72  em, pIn->nMem, r
10960 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
10970 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10980 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
10990 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  t->iParm, r2);. 
109a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
109b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
109c0 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  ert, pDest->iPar
109d0 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
109e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
109f0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
10a00 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
10a10 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
10a20 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
10a30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
10a40 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
10a50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
10a60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
10a70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10a80 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
10a90 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
10aa0 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
10ab0 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
10ac0 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
10ad0 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
10ae0 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
10af0 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
10b00 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
10b10 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
10b20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
10b30 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
10b40 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
10b50 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
10b60 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
10b70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10b80 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a  pIn->nMem==1 );.
10b90 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74        p->affinit
10ba0 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  y = .         sq
10bb0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
10bc0 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  nity(p->pEList->
10bd0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
10be0 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  t->affinity);.  
10bf0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
10c00 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
10c10 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
10c20 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
10c30 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
10c40 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20  n->iMem, 1, r1, 
10c50 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
10c60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10c70 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
10c80 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
10c90 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20  In->iMem, 1);.  
10ca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10cb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
10cc0 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50  nsert, pDest->iP
10cd0 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
10ce0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10cf0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
10d00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10d10 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a      }..#if 0  /*
10d20 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e   Never occurs on
10d30 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65   an ORDER BY que
10d40 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  ry */.    /* If 
10d50 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
10d60 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
10d70 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
10d80 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
10d90 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
10da0 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
10db0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10dc0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
10dd0 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  , 1, pDest->iPar
10de0 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
10df0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
10e00 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
10e10 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
10e20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10e30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
10e40 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
10e50 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
10e60 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
10e70 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
10e80 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
10e90 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
10ea0 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
10eb0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
10ec0 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
10ed0 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
10ee0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
10ef0 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
10f00 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d   assert( pIn->nM
10f10 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  em==1 );.      s
10f20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
10f30 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
10f40 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61  iMem, pDest->iPa
10f50 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
10f60 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
10f70 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
10f80 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
10f90 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
10fa0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
10fb0 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
10fc0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
10fd0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  */..    /* The r
10fe0 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
10ff0 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
11000 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
11010 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
11020 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68  pDest->iMem.  Th
11030 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  en the co-routin
11040 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f  e yields..    */
11050 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
11060 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
11070 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d   if( pDest->iMem
11080 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
11090 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c  Dest->iMem = sql
110a0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
110b0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d  (pParse, pIn->nM
110c0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  em);.        pDe
110d0 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e  st->nMem = pIn->
110e0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nMem;.      }.  
110f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11100 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
11110 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74  pIn->iMem, pDest
11120 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e  ->iMem, pDest->n
11130 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
11140 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11150 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
11160 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
11170 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
11180 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
11190 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
111a0 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
111b0 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
111c0 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
111d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
111e0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
111f0 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
11200 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
11210 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
11220 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
11230 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
11240 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
11250 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
11260 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
11270 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
11280 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
11290 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
112a0 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
112b0 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
112c0 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
112d0 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
112e0 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
112f0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
11300 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
11310 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
11320 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
11330 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
11340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11350 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
11360 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65  ultRow, pIn->iMe
11370 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20  m, pIn->nMem);. 
11380 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11390 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
113a0 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
113b0 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  >iMem, pIn->nMem
113c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
113d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
113e0 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
113f0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
11400 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
11410 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
11420 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
11430 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11440 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p3(v, OP_IfZero,
11450 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
11460 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  ak, -1);.  }..  
11470 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
11480 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
11490 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
114a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
114b0 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
114c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
114d0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
114e0 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
114f0 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
11500 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69  ./*.** Alternati
11510 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  ve compound sele
11520 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  ct code generato
11530 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e  r for cases when
11540 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20   there.** is an 
11550 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
11560 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
11570 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
11580 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
11590 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65  **.**      <sele
115a0 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e  ctA>  <operator>
115b0 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44    <selectB>  ORD
115c0 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69  ER BY <orderbyli
115d0 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61  st>.**.** <opera
115e0 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  tor> is one of U
115f0 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c  NION ALL, UNION,
11600 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
11610 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61  RSECT.  The idea
11620 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62  .** is to code b
11630 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e  oth <selectA> an
11640 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68  d <selectB> with
11650 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11660 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f  ause as.** co-ro
11670 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75  utines.  Then ru
11680 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
11690 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e  s in parallel an
116a0 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75  d merge the resu
116b0 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  lts.** into the 
116c0 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69  output.  In addi
116d0 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20  tion to the two 
116e0 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c  coroutines (call
116f0 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a  ed selectA and.*
11700 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65  * selectB) there
11710 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e   are 7 subroutin
11720 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  es:.**.**    out
11730 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  A:    Move the o
11740 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
11750 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectA coroutine i
11760 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
11770 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
11780 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
11790 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  ery..**.**    ou
117a0 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tB:    Move the 
117b0 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
117c0 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20  lectB coroutine 
117d0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
117e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
117f0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
11800 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e  uery.  (Only gen
11810 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e  erated for UNION
11820 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
11830 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20      UNION ALL.  
11840 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52  EXCEPT and INSER
11850 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70  TSECT never outp
11860 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a  ut a row that.**
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
11880 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29  ears only in B.)
11890 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  .**.**    AltB: 
118a0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
118b0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
118c0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
118d0 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a  s and A<B..**.**
118e0 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c      AeqB:    Cal
118f0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
11900 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
11910 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
11920 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  A==B..**.**    A
11930 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  gtB:    Called w
11940 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
11950 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
11960 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a  utines and A>B..
11970 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20  **.**    EofA:  
11980 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
11990 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
119a0 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a  from selectA..**
119b0 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20  .**    EofB:    
119c0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
119d0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
119e0 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a  om selectB..**.*
119f0 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
11a00 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74  tion of the latt
11a10 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69  er five subrouti
11a20 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68  nes depend on wh
11a30 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  ich .** <operato
11a40 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a  r> is used:.**.*
11a50 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
11a60 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20   UNION ALL      
11a70 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20     UNION        
11a80 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20      EXCEPT      
11a90 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a      INTERSECT.**
11aa0 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
11ab0 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
11ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
11ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
11ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
11af0 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c     AltB:   outA,
11b00 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
11b10 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
11b20 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
11b30 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20    nextA.**.**   
11b40 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AeqB:   outA, ne
11b50 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
11b60 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  A             ne
11b70 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41  xtA         outA
11b80 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20  , nextA.**.**   
11b90 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65  AgtB:   outB, ne
11ba0 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
11bb0 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65  extB          ne
11bc0 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e  xtB            n
11bd0 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  extB.**.**   Eof
11be0 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  A:   outB, nextB
11bf0 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
11c00 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20  B          halt 
11c10 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74              halt
11c20 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20  .**.**   EofB:  
11c30 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
11c40 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
11c50 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
11c60 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
11c70 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20  ** In the AltB, 
11c80 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73  AeqB, and AgtB s
11c90 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45  ubroutines, an E
11ca0 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e  OF on A followin
11cb0 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65  g nextA.** cause
11cc0 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  s an immediate j
11cd0 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20  ump to EofA and 
11ce0 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c  an EOF on B foll
11cf0 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73  owing nextB caus
11d00 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61  es.** an immedia
11d10 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e  te jump to EofB.
11d20 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e    Within EofA an
11d30 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20  d EofB, and EOF 
11d40 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66  on entry or.** f
11d50 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63  ollowing nextX c
11d60 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20  auses a jump to 
11d70 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
11d80 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
11d90 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ..**.** Duplicat
11da0 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65  e removal in the
11db0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
11dc0 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61  and INTERSECT ca
11dd0 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a  ses is handled.*
11de0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74  * within the out
11df0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  put subroutine. 
11e00 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67   The regPrev reg
11e10 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20  ister set holds 
11e20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  the previously.*
11e30 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20  * output value. 
11e40 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   A comparison is
11e50 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68   made against th
11e60 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  is value and the
11e70 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b   output.** is sk
11e80 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78  ipped if the nex
11e90 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20  t results would 
11ea0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
11eb0 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a  he previous..**.
11ec0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
11ed0 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f  ation plan is to
11ee0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74   implement the t
11ef0 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  wo coroutines an
11f00 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f  d seven.** subro
11f10 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68  utines first, th
11f20 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72  en put the contr
11f30 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20  ol logic at the 
11f40 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68  bottom.  Like th
11f50 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
11f60 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20     goto Init.** 
11f70 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69      coA: corouti
11f80 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72  ne for left quer
11f90 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42  y (A).**     coB
11fa0 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
11fb0 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a  right query (B).
11fc0 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70  **    outA: outp
11fd0 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a  ut one row of A.
11fe0 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70  **    outB: outp
11ff0 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20  ut one row of B 
12000 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e  (UNION and UNION
12010 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20   ALL only).**   
12020 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofA: ....**   
12030 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofB: ....**   
12040 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AltB: ....**   
12050 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AeqB: ....**   
12060 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AgtB: ....**   
12070 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a   Init: initializ
12080 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69  e coroutine regi
12090 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  sters.**        
120a0 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20    yield coA.**  
120b0 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41          if eof(A
120c0 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20  ) goto EofA.**  
120d0 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
120e0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  B.**          if
120f0 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66   eof(B) goto Eof
12100 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f  B.**    Cmpr: Co
12110 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20  mpare A, B.**   
12120 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42         Jump AltB
12130 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20  , AeqB, AgtB.** 
12140 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a      End: ....**.
12150 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c  ** We call AltB,
12160 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66   AeqB, AgtB, Eof
12170 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62  A, and EofB "sub
12180 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68  routines" but th
12190 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63  ey are not.** ac
121a0 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73  tually called us
121b0 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68  ing Gosub and th
121c0 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e  ey do not Return
121d0 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  .  EofA and EofB
121e0 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61   loop.** until a
121f0 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75  ll data is exhau
12200 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74  sted then jump t
12210 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65  o the "end" labe
12220 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a  .  AltB, AeqB,.*
12230 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20  * and AgtB jump 
12240 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20  to either L2 or 
12250 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f  to one of EofA o
12260 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64  r EofB..*/.#ifnd
12270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
12280 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73  OMPOUND_SELECT.s
12290 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
122a0 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
122b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
122c0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
122d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
122e0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
122f0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
12300 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
12310 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
12320 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
12330 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
12340 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
12350 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
12360 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
12370 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
12380 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c  ounters */.  Sel
12390 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
123a0 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
123b0 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
123c0 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
123d0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
123e0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
123f0 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
12400 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
12410 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20  tDest destA;    
12420 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
12430 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20  for coroutine A 
12440 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12450 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65  destB;     /* De
12460 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
12470 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69  routine B */.  i
12480 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20  nt regAddrA;    
12490 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
124a0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
124b0 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
124c0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41  */.  int regEofA
124d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
124e0 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ag to indicate w
124f0 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20  hen select-A is 
12500 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  complete */.  in
12510 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
12520 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
12530 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
12540 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
12550 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b  /.  int regEofB;
12560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
12570 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
12580 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63  en select-B is c
12590 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74  omplete */.  int
125a0 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
125b0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
125c0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
125d0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
125e0 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
125f0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
12600 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
12610 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
12620 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
12630 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
12640 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
12650 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
12660 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
12670 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
12680 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
12690 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
126a0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
126b0 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
126c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
126d0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
126e0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
126f0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
12700 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
12710 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
12720 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
12730 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
12740 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
12750 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
12760 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
12770 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
12780 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
12790 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
127a0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
127b0 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
127c0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
127d0 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
127e0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
127f0 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
12800 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
12810 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
12820 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
12830 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
12840 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
12850 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
12860 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
12870 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
12880 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
12890 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
128a0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
128b0 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
128c0 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
128d0 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
128e0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
128f0 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
12900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
12910 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
12920 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
12930 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
12940 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
12950 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
12960 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
12970 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
12980 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
12990 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
129a0 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
129b0 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
129c0 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
129d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
129e0 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
129f0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
12a00 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
12a10 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
12a20 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
12a30 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
12a40 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
12a50 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
12a60 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
12a70 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
12a80 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12aa0 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
12ab0 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
12ac0 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
12ad0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
12ae0 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
12af0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
12b00 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
12b10 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
12b20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
12b30 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
12b40 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
12b50 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
12b60 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
12b70 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
12b80 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
12b90 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
12ba0 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
12bb0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
12bc0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
12bd0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
12be0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
12bf0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
12c00 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
12c10 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
12c20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
12c30 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
12c40 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
12c50 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
12c60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12c70 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
12c80 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
12c90 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
12ca0 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
12cb0 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
12cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
12cd0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
12ce0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
12cf0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
12d00 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
12d10 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
12d20 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
12d30 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
12d40 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
12d50 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
12d60 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
12d70 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
12d80 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
12d90 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
12da0 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
12db0 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
12dc0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
12dd0 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
12de0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
12df0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
12e00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
12e10 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
12e20 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
12e30 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
12e40 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
12e50 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
12e60 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
12e70 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
12e80 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
12e90 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
12ea0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
12eb0 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
12ec0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
12ed0 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
12ee0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
12ef0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
12f00 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
12f10 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
12f20 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
12f30 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
12f40 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
12f50 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
12f60 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
12f70 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
12f80 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
12f90 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
12fa0 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
12fb0 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
12fc0 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
12fd0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
12fe0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
12ff0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
13000 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
13010 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
13020 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
13030 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
13040 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
13050 72 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e  rt( pItem->iCol>
13060 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
13070 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3d 3d 69 20   pItem->iCol==i 
13080 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
13090 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
130a0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
130b0 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
130c0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
130d0 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
130e0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
130f0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
13100 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
13110 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
13120 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
13130 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
13140 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
13150 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c    pOrderBy = sql
13160 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
13170 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
13180 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
13190 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
131a0 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69 43 6f 6c  nOrderBy++].iCol
131b0 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
131c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
131d0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
131e0 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
131f0 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
13200 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
13210 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
13220 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
13230 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
13240 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
13250 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
13260 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
13270 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
13280 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
13290 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
132a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
132b0 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
132c0 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
132d0 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
132e0 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
132f0 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
13300 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
13310 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
13320 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
13330 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
13340 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
13350 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f  , sizeof(int)*nO
13360 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61  rderBy);.  if( a
13370 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
13380 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
13390 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
133a0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
133b0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f  OrderBy->a; i<nO
133c0 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
133d0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
133e0 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c  ert( pItem->iCol
133f0 3e 30 20 20 26 26 20 70 49 74 65 6d 2d 3e 69 43  >0  && pItem->iC
13400 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
13410 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50  Expr );.      aP
13420 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65  ermute[i] = pIte
13430 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  m->iCol - 1;.   
13440 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65   }.    pKeyMerge
13450 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
13460 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
13470 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d 65 72 67  sizeof(*pKeyMerg
13480 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28 73 69 7a  e)+nOrderBy*(siz
13490 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
134a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d  );.    if( pKeyM
134b0 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 70 4b  erge ){.      pK
134c0 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72  eyMerge->aSortOr
134d0 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79  der = (u8*)&pKey
134e0 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72  Merge->aColl[nOr
134f0 64 65 72 42 79 5d 3b 0a 20 20 20 20 20 20 70 4b  derBy];.      pK
13500 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65 6c 64 20  eyMerge->nField 
13510 3d 20 28 75 31 36 29 6e 4f 72 64 65 72 42 79 3b  = (u16)nOrderBy;
13520 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
13530 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
13540 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
13550 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
13560 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
13570 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
13580 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20    Expr *pTerm = 
13590 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
135a0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
135b0 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
135c0 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
135d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
135e0 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c  l = pTerm->pColl
135f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13600 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
13610 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
13620 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
13630 20 61 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20   aPermute[i]);. 
13640 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
13650 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
13660 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20  ollate;.        
13670 20 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d    pTerm->pColl =
13680 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pColl;.        
13690 7d 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65  }.        pKeyMe
136a0 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  rge->aColl[i] = 
136b0 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  pColl;.        p
136c0 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f  KeyMerge->aSortO
136d0 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72  rder[i] = pOrder
136e0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
136f0 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  er;.      }.    
13700 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
13710 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
13720 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
13730 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
13740 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
13750 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
13760 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
13770 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
13780 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
13790 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
137a0 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
137b0 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
137c0 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
137d0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
137e0 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
137f0 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
13800 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
13810 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
13820 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
13830 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
13840 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
13850 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
13860 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
13870 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
13880 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
13890 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
138a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
138b0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
138c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
138d0 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
138e0 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
138f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13900 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
13910 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
13920 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70  nge(pParse, nExp
13930 72 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r+1);.    sqlite
13940 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13950 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
13960 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
13970 44 75 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Dup = sqlite3DbM
13980 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20  allocZero(db,.  
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139a0 73 69 7a 65 6f 66 28 2a 70 4b 65 79 44 75 70 29  sizeof(*pKeyDup)
139b0 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66   + nExpr*(sizeof
139c0 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b  (CollSeq*)+1) );
139d0 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70  .    if( pKeyDup
139e0 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 44 75   ){.      pKeyDu
139f0 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
13a00 28 75 38 2a 29 26 70 4b 65 79 44 75 70 2d 3e 61  (u8*)&pKeyDup->a
13a10 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20  Coll[nExpr];.   
13a20 20 20 20 70 4b 65 79 44 75 70 2d 3e 6e 46 69 65     pKeyDup->nFie
13a30 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b  ld = (u16)nExpr;
13a40 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
13a50 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
13a60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13a70 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13a80 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43       pKeyDup->aC
13a90 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65  oll[i] = multiSe
13aa0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
13ab0 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
13ac0 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
13ad0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20  tOrder[i] = 0;. 
13ae0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13af0 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65  . .  /* Separate
13b00 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68   the left and th
13b10 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72  e right query fr
13b20 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20  om one another. 
13b30 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   */.  p->pPrior 
13b40 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  = 0;.  sqlite3Re
13b50 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
13b60 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
13b70 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
13b80 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  ");.  if( pPrior
13b90 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
13ba0 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
13bb0 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
13bc0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50  arse, pPrior, pP
13bd0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rior->pOrderBy, 
13be0 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20  "ORDER");.  }.. 
13bf0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
13c00 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
13c10 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
13c20 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
13c30 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  e, p, labelEnd);
13c40 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
13c50 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   && op==TK_ALL )
13c60 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
13c70 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
13c80 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20  ;.    regLimitB 
13c90 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
13ca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13cb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
13cc0 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f  py, p->iOffset ?
13cd0 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20   p->iOffset+1 : 
13ce0 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20  p->iLimit,.     
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
13d10 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c  LimitA);.    sql
13d20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13d30 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69  , OP_Copy, regLi
13d40 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29  mitA, regLimitB)
13d50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
13d60 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69  egLimitA = regLi
13d70 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  mitB = 0;.  }.  
13d80 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
13d90 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
13da0 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
13db0 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
13dc0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
13dd0 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66  ffset);.  p->pOf
13de0 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67  fset = 0;..  reg
13df0 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65  AddrA = ++pParse
13e00 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66  ->nMem;.  regEof
13e10 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
13e20 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d  em;.  regAddrB =
13e30 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
13e40 0a 20 20 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70  .  regEofB = ++p
13e50 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
13e60 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73  egOutA = ++pPars
13e70 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
13e80 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
13e90 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Mem;.  sqlite3Se
13ea0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
13eb0 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stA, SRT_Corouti
13ec0 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ne, regAddrA);. 
13ed0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
13ee0 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53  stInit(&destB, S
13ef0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
13f00 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a  gAddrB);..  /* J
13f10 75 6d 70 20 70 61 73 74 20 74 68 65 20 76 61 72  ump past the var
13f20 69 6f 75 73 20 73 75 62 72 6f 75 74 69 6e 65 73  ious subroutines
13f30 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65 73 20   and coroutines 
13f40 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a  to the main.  **
13f50 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
13f60 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56  .  j1 = sqlite3V
13f70 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
13f80 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c  Goto);.  addrSel
13f90 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64  ectA = sqlite3Vd
13fa0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
13fb0 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  ;...  /* Generat
13fc0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
13fd0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
13fe0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
13ff0 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
14000 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
14010 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
14020 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  A" select..  */.
14030 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
14040 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72  t((v, "Begin cor
14050 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
14060 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72  SELECT"));.  pPr
14070 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65  ior->iLimit = re
14080 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61  gLimitA;.  expla
14090 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
140a0 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
140b0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
140c0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
140d0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
140e0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
140f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
14100 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f  nteger, 1, regEo
14110 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
14120 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
14130 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
14140 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
14150 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f  nt((v, "End coro
14160 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53  utine for left S
14170 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20  ELECT"));..  /* 
14180 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
14190 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
141a0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
141b0 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
141c0 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
141d0 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
141e0 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
141f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
14200 74 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65  tAddr(v);.  Vdbe
14210 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
14220 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65  "Begin coroutine
14230 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43   for right SELEC
14240 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d  T"));.  savedLim
14250 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
14260 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20    savedOffset = 
14270 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
14280 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
14290 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  itB;.  p->iOffse
142a0 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61  t = 0;  .  expla
142b0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
142c0 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
142d0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
142e0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
142f0 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a  se, p, &destB);.
14300 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
14310 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
14320 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
14330 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
14340 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14350 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45  Integer, 1, regE
14360 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
14370 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14380 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
14390 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
143a0 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72  ent((v, "End cor
143b0 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
143c0 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f   SELECT"));..  /
143d0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
143e0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
143f0 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
14400 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
14410 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
14420 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
14430 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
14440 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
14450 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
14460 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
14470 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20  ine for A"));.  
14480 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72  addrOutA = gener
14490 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
144a0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
144c0 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72  &destA, pDest, r
144d0 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20  egOutA,.        
144e0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
144f0 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45  , pKeyDup, P4_KE
14500 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c  YINFO_HANDOFF, l
14510 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
14520 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
14530 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
14540 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
14550 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
14560 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
14570 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
14580 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
14590 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
145a0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
145b0 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
145c0 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
145d0 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
145e0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
145f0 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
14600 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
14610 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
14620 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
14630 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
14640 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
14670 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  p, P4_KEYINFO_ST
14680 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ATIC, labelEnd);
14690 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
146a0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
146b0 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
146c0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
146d0 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
146e0 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
146f0 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
14700 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
14710 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
14720 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
14730 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
14740 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
14750 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
14760 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
14770 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
14780 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14790 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e  Goto, 0, labelEn
147a0 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  d);.  }else{  . 
147b0 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
147c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
147d0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
147e0 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
147f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14800 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
14810 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
14820 74 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tB);.    sqlite3
14830 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14840 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
14850 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14860 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
14870 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41  oto, 0, addrEofA
14880 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  );.    p->nSelec
14890 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
148a0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a  nSelectRow;.  }.
148b0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
148c0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
148d0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
148e0 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
148f0 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  B.  ** are exhau
14900 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
14910 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72  ta in select A r
14920 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
14930 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
14940 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
14950 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a  ofB = addrEofA;.
14960 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
14970 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e  ctRow > pPrior->
14980 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
14990 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
149a0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
149b0 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
149c0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
149d0 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f  (v, "eof-B subro
149e0 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
149f0 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33  drEofB = sqlite3
14a00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14a10 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61  _If, regEofA, la
14a20 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  belEnd);.    sql
14a30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14a40 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
14a50 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
14a60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14a70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
14a80 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
14a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14aa0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
14ab0 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  0, addrEofB);.  
14ac0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
14ad0 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
14ae0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a  the case of A<B.
14af0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
14b00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74  omment((v, "A-lt
14b10 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
14b20 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73  ;.  addrAltB = s
14b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14b40 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
14b50 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
14b60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14b70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
14b80 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
14b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ba0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
14bb0 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  ofA, addrEofA);.
14bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14bd0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
14be0 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
14bf0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
14c00 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
14c10 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20   case of A==B.  
14c20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
14c30 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ALL ){.    addrA
14c40 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
14c50 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
14c60 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
14c70 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
14c80 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64  ddrAltB;.    add
14c90 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rAltB++;.  }else
14ca0 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
14cb0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d  mment((v, "A-eq-
14cc0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
14cd0 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a  .    addrAeqB =.
14ce0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14cf0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
14d00 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
14d10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14d20 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
14d30 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29  gEofA, addrEofA)
14d40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14d50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
14d60 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
14d70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
14d80 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
14d90 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
14da0 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A>B.  */.  Vdbe
14db0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
14dc0 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-gt-B subrouti
14dd0 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74  ne"));.  addrAgt
14de0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
14df0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
14e00 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
14e10 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
14e20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14e30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
14e40 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
14e50 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20  ddrOutB);.  }.  
14e60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14e70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
14e80 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71 6c 69  egAddrB);.  sqli
14e90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14ea0 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
14eb0 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 73 71   addrEofB);.  sq
14ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14ed0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
14ee0 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
14ef0 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
14f00 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
14f10 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
14f20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14f30 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
14f40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14f50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14f60 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 41 29  ger, 0, regEofA)
14f70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14f80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14f90 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 42 29  ger, 0, regEofB)
14fa0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14fb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
14fc0 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  b, regAddrA, add
14fd0 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c  rSelectA);.  sql
14fe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14ff0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41  , OP_Gosub, regA
15000 64 64 72 42 2c 20 61 64 64 72 53 65 6c 65 63 74  ddrB, addrSelect
15010 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
15020 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
15030 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
15040 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
15050 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15060 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64  If, regEofB, add
15070 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d  rEofB);..  /* Im
15080 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
15090 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
150a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
150b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
150c0 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
150d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
150e0 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
150f0 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
15100 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
15110 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
15120 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
15130 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
15140 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d  A.iMem, destB.iM
15150 65 6d 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  em, nOrderBy,.  
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15170 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
15180 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49  eyMerge, P4_KEYI
15190 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
151a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
151b0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
151c0 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42  drAltB, addrAeqB
151d0 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a 20 20  , addrAgtB);..  
151e0 2f 2a 20 52 65 6c 65 61 73 65 20 74 65 6d 70 6f  /* Release tempo
151f0 72 61 72 79 20 72 65 67 69 73 74 65 72 73 0a 20  rary registers. 
15200 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
15210 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
15220 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
15230 28 70 50 61 72 73 65 2c 20 72 65 67 50 72 65 76  (pParse, regPrev
15240 2c 20 6e 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20  , nOrderBy+1);. 
15250 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
15260 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
15270 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
15280 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
15290 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
152a0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
152b0 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
152c0 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
152d0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c  er of output col
152e0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
152f0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
15300 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
15310 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
15320 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69   pPrior;.    whi
15330 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
15340 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
15350 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
15360 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
15370 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
15380 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
15390 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73  ;.  }..  /* Reas
153a0 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
153b0 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
153c0 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
153d0 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
153e0 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
153f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
15400 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
15410 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
15420 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
15430 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
15440 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
15450 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20  ;..  /*** TBD:  
15460 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e  Insert subroutin
15470 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65  e calls to close
15480 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f   cursors on inco
15490 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75  mplete.  **** su
154a0 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20  bqueries ****/. 
154b0 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
154c0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
154d0 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30   iSub1, iSub2, 0
154e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
154f0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
15500 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
15510 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15520 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
15530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
15540 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  )./* Forward Dec
15550 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
15560 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
15570 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
15580 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
15590 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
155a0 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
155b0 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
155c0 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
155d0 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a  prList *);../*.*
155e0 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
155f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
15600 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
15610 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
15620 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
15630 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
15640 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
15650 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
15660 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
15670 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
15680 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
15690 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
156a0 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
156b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
156c0 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
156d0 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
156e0 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
156f0 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
15700 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
15710 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
15720 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
15730 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
15740 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
15750 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
15760 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
15770 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
15780 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
15790 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
157a0 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
157b0 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
157c0 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
157d0 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
157e0 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
157f0 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
15800 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
15810 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
15820 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
15830 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
15840 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74  atic Expr *subst
15850 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
15860 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52  *db,        /* R
15870 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
15880 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e  ors to this conn
15890 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
158a0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
158b0 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
158c0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
158d0 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  curs */.  int iT
158e0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  able,         /*
158f0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
15900 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
15910 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
15920 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
15930 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29  expressions */.)
15940 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
15950 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
15960 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
15970 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
15980 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
15990 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
159a0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
159b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
159c0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
159d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
159e0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73   *pNew;.      as
159f0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
15a00 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
15a10 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
15a20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15a30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
15a40 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
15a50 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
15a60 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
15a70 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
15a80 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
15a90 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
15aa0 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 70     if( pNew && p
15ab0 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20  Expr->pColl ){. 
15ac0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f         pNew->pCo
15ad0 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c  ll = pExpr->pCol
15ae0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
15af0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
15b00 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
15b10 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
15b20 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  w;.    }.  }else
15b30 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  {.    pExpr->pLe
15b40 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ft = substExpr(d
15b50 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
15b60 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
15b70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
15b80 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  ght = substExpr(
15b90 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
15ba0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
15bb0 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
15bc0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15bd0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
15be0 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
15bf0 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d  elect(db, pExpr-
15c00 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  >x.pSelect, iTab
15c10 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
15c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
15c30 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
15c40 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
15c50 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
15c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15c70 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61  urn pExpr;.}.sta
15c80 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
15c90 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
15ca0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
15cb0 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
15cc0 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
15cd0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
15ce0 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
15cf0 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
15d00 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
15d10 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
15d20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
15d30 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
15d40 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
15d50 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
15d60 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
15d70 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
15d80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
15d90 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
15da0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
15db0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
15dc0 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
15dd0 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
15de0 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d  tExpr(db, pList-
15df0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
15e00 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
15e10 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
15e20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73  substSelect(.  s
15e30 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
15e40 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
15e50 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
15e60 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
15e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
15e80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
15e90 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
15ea0 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
15eb0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
15ec0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
15ed0 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
15ee0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
15ef0 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
15f00 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
15f10 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
15f20 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
15f30 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
15f40 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
15f50 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
15f60 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
15f70 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  db, p->pEList, i
15f80 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
15f90 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
15fa0 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
15fb0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
15fc0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
15fd0 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  t(db, p->pOrderB
15fe0 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
15ff0 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67  t);.  p->pHaving
16000 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
16010 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
16020 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16030 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
16040 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68  tExpr(db, p->pWh
16050 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
16060 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c  ist);.  substSel
16070 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ect(db, p->pPrio
16080 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
16090 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  t);.  pSrc = p->
160a0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
160b0 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e  pSrc );  /* Even
160c0 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20   for (SELECT 1) 
160d0 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30  we have: pSrc!=0
160e0 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d   but pSrc->nSrc=
160f0 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  =0 */.  if( ALWA
16100 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20  YS(pSrc) ){.    
16110 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
16120 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
16130 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
16140 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
16150 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d  Select(db, pItem
16160 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
16170 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
16180 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
16190 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
161a0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
161b0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
161c0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
161d0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
161e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
161f0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
16200 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
16210 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EW)./*.** This r
16220 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
16230 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
16240 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74  eries in order t
16250 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75  o speed.** execu
16260 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e  tion.  It return
16270 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
16280 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
16290 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a   no flattening.*
162a0 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  * occurs..**.** 
162b0 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
162c0 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
162d0 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
162e0 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
162f0 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
16300 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
16310 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
16320 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
16330 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
16340 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
16350 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
16360 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
16370 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
16380 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
16390 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
163a0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
163b0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
163c0 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
163d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
163e0 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
163f0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
16400 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
16410 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
16420 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
16430 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
16440 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
16450 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
16460 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
16470 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
16480 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
16490 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
164a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
164b0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
164c0 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
164d0 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
164e0 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
164f0 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
16500 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
16510 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
16520 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
16530 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
16540 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
16550 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
16560 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76  impification giv
16570 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
16580 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
16590 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
165a0 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
165b0 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
165c0 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
165d0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
165e0 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
165f0 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
16600 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
16610 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
16620 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
16630 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
16640 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
16650 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
16660 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16670 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
16680 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
16690 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
166a0 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
166b0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
166c0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
166d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
166e0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
166f0 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
16700 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
16710 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
16720 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
16730 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20  er join.**      
16740 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69    (Originally ti
16750 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65  cket #306.  Stre
16760 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b  ngthened by tick
16770 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20  et #3300).**.** 
16780 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75    (4)  The subqu
16790 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
167a0 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  NCT..**.**  (**)
167b0 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72    At one point r
167c0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20  estrictions (4) 
167d0 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64 20  and (5) defined 
167e0 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53 54  a subset of DIST
167f0 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73  INCT.**        s
16800 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74 20  ub-queries that 
16810 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66 72  were excluded fr
16820 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  om this optimiza
16830 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f  tion. Restrictio
16840 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29  n .**        (4)
16850 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20   has since been 
16860 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c  expanded to excl
16870 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54  ude all DISTINCT
16880 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a   subqueries..**.
16890 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
168a0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
168b0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
168c0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
168d0 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
168e0 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
168f0 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
16900 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f  bquery has a FRO
16910 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
16920 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75    (8)  The subqu
16930 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
16940 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
16950 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
16960 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
16970 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65   (9)  The subque
16980 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
16990 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
169a0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
169b0 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
169c0 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
169d0 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62  *  (10)  The sub
169e0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
169f0 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
16a00 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16a10 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
16a20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a      use LIMIT..*
16a30 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20  *.**  (11)  The 
16a40 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
16a50 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
16a60 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
16a70 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
16a80 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74  **.**  (**)  Not
16a90 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53   implemented.  S
16aa0 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
16ab0 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57  triction (3).  W
16ac0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  as previously.**
16ad0 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61          a separa
16ae0 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64  te restriction d
16af0 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63  eriving from tic
16b00 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20  ket #350..**.** 
16b10 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
16b20 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
16b30 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
16b40 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
16b50 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71    (14)  The subq
16b60 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
16b70 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  e OFFSET..**.** 
16b80 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72   (15)  The outer
16b90 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61   query is not pa
16ba0 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
16bb0 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a   select or the.*
16bc0 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
16bd0 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
16be0 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a  a LIMIT clause..
16bf0 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74  **        (See t
16c00 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20  icket #2339 and 
16c10 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64  ticket [02a8e81d
16c20 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36  44])..**.**  (16
16c30 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
16c40 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
16c50 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75  regate or the su
16c60 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20  bquery does.**  
16c70 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69        not contai
16c80 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69  n ORDER BY.  (Ti
16c90 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69  cket #2942)  Thi
16ca0 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61  s used to not ma
16cb0 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75  tter.**        u
16cc0 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63  ntil we introduc
16cd0 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e  ed the group_con
16ce0 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  cat() function. 
16cf0 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54   .**.**  (17)  T
16d00 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
16d10 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73  not a compound s
16d20 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20  elect, or it is 
16d30 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20  a UNION ALL .** 
16d40 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20         compound 
16d50 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65  clause made up e
16d60 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61  ntirely of non-a
16d70 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
16d80 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20  , and .**       
16d90 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
16da0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  y:.**.**        
16db0 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c    * is not itsel
16dc0 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  f part of a comp
16dd0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20  ound select,.** 
16de0 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
16df0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
16e00 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79  r DISTINCT query
16e10 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
16e20 20 20 2a 20 68 61 73 20 6e 6f 20 6f 74 68 65 72    * has no other
16e30 20 74 61 62 6c 65 73 20 6f 72 20 73 75 62 2d 73   tables or sub-s
16e40 65 6c 65 63 74 73 20 69 6e 20 74 68 65 20 46 52  elects in the FR
16e50 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
16e60 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
16e70 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
16e80 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
16e90 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
16ea0 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
16eb0 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
16ec0 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
16ed0 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
16ee0 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
16ef0 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
16f00 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 0a  OFFSET clauses..
16f10 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20  **.**  (18)  If 
16f20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
16f30 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
16f40 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  ct, then all ter
16f50 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ms of the.**    
16f60 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61      ORDER by cla
16f70 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  use of the paren
16f80 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65  t must be simple
16f90 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a   references to .
16fa0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  **        column
16fb0 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  s of the sub-que
16fc0 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20  ry..**.**  (19) 
16fd0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
16fe0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
16ff0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
17000 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
17010 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
17020 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
17030 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20  *  (20)  If the 
17040 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
17050 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
17060 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74  then it must not
17070 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
17080 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
17090 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33  e.  Ticket #3773
170a0 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61  .  We could rela
170b0 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  x this constrain
170c0 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65  t.**        some
170d0 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74  what by saying t
170e0 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66  hat the terms of
170f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
17100 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20  ause must.**    
17110 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e      appear as un
17120 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20  modified result 
17130 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  columns in the o
17140 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  uter query.  But
17150 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
17160 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  other optimizati
17170 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64  ons in mind to d
17180 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61  eal with that ca
17190 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20  se..**.**  (21) 
171a0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
171b0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
171c0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
171d0 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
171e0 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20       DISTINCT.  
171f0 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32  (See ticket [752
17200 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a  e1646fc])..**.**
17210 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
17220 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
17230 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
17240 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
17250 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
17260 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
17270 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
17280 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
17290 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
172a0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
172b0 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
172c0 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
172d0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
172e0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
172f0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
17300 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
17310 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17320 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
17330 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
17340 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
17350 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
17360 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
17370 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
17380 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
17390 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
173a0 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
173b0 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
173c0 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
173d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
173e0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
173f0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
17400 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
17410 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
17420 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
17430 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
17440 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
17450 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
17460 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
17470 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
17480 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17490 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
174a0 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
174b0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
174c0 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
174d0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
174e0 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
174f0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
17500 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
17510 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
17520 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
17530 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
17540 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
17550 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
17560 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
17570 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
17580 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
17590 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20  lect *pParent;. 
175a0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
175b0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
175c0 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
175d0 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63  uery" */.  Selec
175e0 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f  t *pSub1;      /
175f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
17600 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63   rightmost selec
17610 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a  t in sub-query *
17620 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
17630 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
17640 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
17650 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
17660 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
17670 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
17680 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
17690 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45   subquery */.  E
176a0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
176b0 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
176c0 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
176d0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
176e0 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
176f0 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
17700 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
17710 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
17720 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
17730 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
17740 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17750 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  r */.  Expr *pWh
17760 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ere;            
17770 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
17780 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
17790 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
177a0 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20  item *pSubitem; 
177b0 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
177c0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
177d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
177e0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
177f0 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
17800 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
17810 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
17820 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17830 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
17840 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
17850 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f  );  /* Unable to
17860 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e   flatten compoun
17870 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  d queries */.  i
17880 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
17890 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
178a0 65 6e 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b  ener ) return 0;
178b0 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
178c0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
178d0 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
178e0 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
178f0 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
17900 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
17910 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
17920 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
17930 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
17940 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
17950 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
17960 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
17970 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
17980 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
17990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
179a0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
179b0 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  */.  if( subquer
179c0 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
179d0 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
179e0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
179f0 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20  estriction (2)  
17a00 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  */.  pSubSrc = p
17a10 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
17a20 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
17a30 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
17a40 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
17a50 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
17a60 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
17a70 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
17a80 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
17a90 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20  y expresssions, 
17aa0 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20  we allowed some 
17ab0 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d  combining of LIM
17ac0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
17ad0 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20  ** because they 
17ae0 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  could be compute
17af0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
17b00 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d  e.  But when LIM
17b10 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
17b20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72  ** became arbitr
17b30 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
17b40 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20   we were forced 
17b50 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69  to add restricti
17b60 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e  ons (13).  ** an
17b70 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28  d (14). */.  if(
17b80 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
17b90 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
17ba0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
17bb0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
17bc0 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28  on (13) */.  if(
17bd0 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29   pSub->pOffset )
17be0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c00 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
17c10 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28  on (14) */.  if(
17c20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26   p->pRightmost &
17c30 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
17c40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 2f 2a 20 52 65             /* Re
17c80 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
17c90 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
17ca0 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
17cb0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17cd0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
17ce0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
17cf0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
17d00 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
17d10 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
17d20 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * Restriction (5
17d30 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
17d40 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
17d50 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
17d60 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
17d70 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
17d80 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
17d90 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
17da0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
17db0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
17dc0 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
17dd0 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  g ){.     return
17de0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
17df0 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
17e00 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
17e10 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
17e20 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
17e30 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 2f 2a 20 52 65 73 74 72 69         /* Restri
17e70 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
17e80 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
17e90 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
17ea0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
17eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17ec0 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
17ed0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
17ee0 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
17ef0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
17f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17f10 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
17f20 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
17f30 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
17f40 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
17f50 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
17f60 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
17f70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
17f80 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  (21) */.  }..  /
17f90 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
17fa0 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 1:.  ** Restr
17fb0 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68  iction 3:  If th
17fc0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
17fd0 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
17fe0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
17ff0 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61  .  ** not used a
18000 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
18010 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20  and of an outer 
18020 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20  join.  Examples 
18030 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a  of why this.  **
18040 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
18050 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
18060 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
18070 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
18080 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
18090 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
180a0 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
180b0 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
180c0 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
180d0 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
180e0 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
180f0 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
18100 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
18110 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53  g..  **.  ** OBS
18120 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a  OLETE COMMENT 2:
18130 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
18140 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
18150 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
18160 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
18170 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
18180 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
18190 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
181a0 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
181b0 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
181c0 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
181d0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
181e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
181f0 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
18200 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
18210 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
18220 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
18230 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
18240 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
18250 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
18260 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
18270 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
18280 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
18290 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
182a0 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
182b0 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
182c0 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
182d0 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
182e0 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
182f0 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
18300 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
18310 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49  N..  **.  ** THI
18320 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f  S OVERRIDES OBSO
18330 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20  LETE COMMENTS 1 
18340 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a  AND 2 ABOVE:.  *
18350 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73  * Ticket #3300 s
18360 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65  hows that flatte
18370 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74  ning the right t
18380 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
18390 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67  IN.  ** is fraug
183a0 68 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20  ht with danger. 
183b0 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74   Best to avoid t
183c0 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20  he whole thing. 
183d0 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   If the.  ** sub
183e0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
183f0 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
18400 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20  T JOIN, then do 
18410 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a  not flatten..  *
18420 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65  /.  if( (pSubite
18430 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
18440 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
18450 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
18460 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
18470 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62  n 17: If the sub
18480 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
18490 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65  ound SELECT, the
184a0 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75  n it must.  ** u
184b0 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f  se only the UNIO
184c0 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20  N ALL operator. 
184d0 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
184e0 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75  simple select qu
184f0 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  eries.  ** that 
18500 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70  make up the comp
18510 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20  ound SELECT are 
18520 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67  allowed to be ag
18530 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69  gregate or disti
18540 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  nct.  ** queries
18550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
18560 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
18570 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
18580 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rBy ){.      ret
18590 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72  urn 0;  /* Restr
185a0 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20  iction 20 */.   
185b0 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67   }.    if( isAgg
185c0 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
185d0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
185e0 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
185f0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
18600 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
18610 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
18620 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
18630 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
18640 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
18650 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
18660 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
18670 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
18680 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
18690 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
186a0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
186b0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
186c0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
186d0 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
186e0 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73     if( (pSub1->s
186f0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
18700 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
18710 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20  ate))!=0.       
18720 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f  || (pSub1->pPrio
18730 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d  r && pSub1->op!=
18740 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20  TK_ALL) .       
18750 7c 7c 20 4e 45 56 45 52 28 70 53 75 62 31 2d 3e  || NEVER(pSub1->
18760 70 53 72 63 3d 3d 30 29 20 7c 7c 20 70 53 75 62  pSrc==0) || pSub
18770 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  1->pSrc->nSrc!=1
18780 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
18790 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
187a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
187b0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38  * Restriction 18
187c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
187d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
187e0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
187f0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
18800 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
18810 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
18820 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
18830 3e 61 5b 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29  >a[ii].iCol==0 )
18840 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
18850 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
18860 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
18870 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
18880 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
18890 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a  mitted. *****/..
188a0 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74    /* Authorize t
188b0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
188c0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
188d0 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d  ntext = pSubitem
188e0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ->zName;.  sqlit
188f0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
18900 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
18910 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70  T, 0, 0, 0);.  p
18920 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
18930 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
18940 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49  Context;..  /* I
18950 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
18960 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
18970 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
18980 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63  then (by restric
18990 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e  tions.  ** 17 an
189a0 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d  d 18 above) it m
189b0 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41  ust be a UNION A
189c0 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e  LL and the paren
189d0 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20  t query must .  
189e0 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  ** be of the for
189f0 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
18a00 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69   SELECT <expr-li
18a10 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71  st> FROM (<sub-q
18a20 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c  uery>) <where-cl
18a30 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ause> .  **.  **
18a40 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79   followed by any
18a50 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
18a60 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63   and/or OFFSET c
18a70 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f  lauses. This blo
18a80 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20  ck.  ** creates 
18a90 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68  N-1 copies of th
18aa0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77  e parent query w
18ab0 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52  ithout any ORDER
18ac0 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20   BY, LIMIT or . 
18ad0 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73   ** OFFSET claus
18ae0 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65  es and joins the
18af0 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61  m to the left-ha
18b00 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f  nd-side of the o
18b10 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69  riginal.  ** usi
18b20 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  ng UNION ALL ope
18b30 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20  rators. In this 
18b40 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75  case N is the nu
18b50 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20  mber of simple. 
18b60 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65   ** select state
18b70 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d  ments in the com
18b80 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e  pound sub-query.
18b90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
18ba0 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
18bb0 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f    SELECT a+1 FRO
18bc0 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  M (.  **        
18bd0 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61  SELECT x FROM ta
18be0 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
18bf0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
18c00 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f      SELECT y FRO
18c10 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
18c20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
18c30 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
18c40 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62  bs(z*2) FROM tab
18c50 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45  2.  **     ) WHE
18c60 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59  RE a!=5 ORDER BY
18c70 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61   1.  **.  ** Tra
18c80 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20  nsformed into:. 
18c90 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
18ca0 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62  ECT x+1 FROM tab
18cb0 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20   WHERE x+1!=5.  
18cc0 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
18cd0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
18ce0 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   y+1 FROM tab WH
18cf0 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE y+1!=5.  ** 
18d00 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
18d10 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62  **     SELECT ab
18d20 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61  s(z*2)+1 FROM ta
18d30 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32  b2 WHERE abs(z*2
18d40 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  )+1!=5.  **     
18d50 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
18d60 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69    ** We call thi
18d70 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d  s the "compound-
18d80 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
18d90 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ing"..  */.  for
18da0 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69  (pSub=pSub->pPri
18db0 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  or; pSub; pSub=p
18dc0 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
18dd0 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
18de0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
18df0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
18e00 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  erBy;.    Expr *
18e10 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
18e20 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  it;.    Select *
18e30 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
18e40 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  or;.    p->pOrde
18e50 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
18e60 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pSrc = 0;.    p-
18e70 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
18e80 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
18e90 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
18ea0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
18eb0 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c  p, 0);.    p->pL
18ec0 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
18ed0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
18ee0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70   pOrderBy;.    p
18ef0 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
18f00 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c     p->op = TK_AL
18f10 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74  L;.    p->pRight
18f20 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  most = 0;.    if
18f30 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
18f40 20 20 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72     pNew = pPrior
18f50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18f60 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
18f70 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
18f80 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74  pNew->pRightmost
18f90 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
18fa0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77  p->pPrior = pNew
18fb0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
18fc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
18fd0 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
18fe0 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
18ff0 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
19000 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
19010 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
19020 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
19030 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
19040 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
19050 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
19060 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
19070 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
19080 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
19090 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
190a0 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
190b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
190c0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
190d0 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
190e0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
190f0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
19100 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
19110 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
19120 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
19130 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
19140 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
19150 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
19160 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
19170 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
19180 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
19190 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
191a0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
191b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
191c0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
191d0 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
191e0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
191f0 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
19200 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
19210 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
19220 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
19230 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
19240 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
19250 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
19260 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
19270 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
19280 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
19290 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
192a0 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
192b0 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
192c0 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
192d0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
192e0 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
192f0 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
19300 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
19310 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
19320 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
19330 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
19340 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
19350 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
19360 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
19370 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
19380 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
19390 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
193a0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
193b0 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
193c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
193d0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
193e0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
193f0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
19400 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
19410 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
19420 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
19430 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
19440 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
19450 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
19460 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
19470 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
19480 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
19490 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
194a0 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
194b0 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
194c0 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
194d0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
194e0 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
194f0 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
19500 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
19510 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
19520 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
19530 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
19540 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
19550 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
19560 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
19570 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
19580 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
19590 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
195a0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
195b0 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
195c0 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
195d0 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
195e0 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
195f0 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
19600 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
19610 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
19620 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
19630 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
19640 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
19650 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
19660 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
19670 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
19680 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
19690 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
196a0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
196b0 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
196c0 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
196d0 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
196e0 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
196f0 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
19700 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
19710 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
19720 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
19730 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
19740 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
19750 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
19760 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
19770 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
19780 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
19790 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
197a0 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
197b0 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
197c0 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
197d0 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
197e0 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
197f0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
19800 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
19810 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
19820 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
19830 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
19840 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
19850 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
19860 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
19870 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
19880 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
19890 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
198a0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
198b0 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
198c0 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
198d0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
198e0 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
198f0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
19900 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
19910 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
19920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
19930 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
19940 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
19950 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
19960 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19970 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
19980 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
19990 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
199a0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
199b0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
199c0 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
199d0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
199e0 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
199f0 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
19a00 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
19a10 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
19a20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
19a30 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
19a40 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
19a50 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
19a60 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
19a70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
19a80 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
19a90 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
19aa0 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
19ab0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
19ac0 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
19ad0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19ae0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
19af0 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
19b00 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
19b10 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
19b20 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
19b30 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
19b40 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
19b50 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
19b60 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
19b70 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
19b80 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
19b90 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
19ba0 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
19bb0 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
19bc0 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
19bd0 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
19be0 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
19bf0 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
19c00 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
19c10 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
19c20 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
19c30 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
19c40 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
19c50 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
19c60 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
19c70 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
19c80 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
19c90 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
19ca0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
19cb0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
19cc0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
19cd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
19ce0 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
19cf0 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
19d00 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
19d10 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
19d20 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
19d30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19d40 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
19d50 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
19d60 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
19d70 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
19d80 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
19d90 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
19da0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
19db0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
19dc0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
19dd0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
19de0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
19df0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
19e00 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
19e10 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
19e20 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
19e30 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
19e40 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
19e50 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
19e60 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
19e70 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
19e80 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
19e90 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
19ea0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
19eb0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
19ec0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
19ed0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
19ee0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
19ef0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
19f00 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
19f10 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
19f20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
19f30 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
19f40 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
19f50 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
19f60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
19f70 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
19f80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
19f90 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
19fa0 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
19fb0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
19fc0 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
19fd0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
19fe0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
19ff0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1a000 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
1a010 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1a020 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
1a030 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
1a040 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
1a050 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
1a060 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1a070 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1a080 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
1a090 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
1a0a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
1a0b0 73 74 20 63 68 61 72 20 2a 7a 53 70 61 6e 20 3d  st char *zSpan =
1a0c0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70   pList->a[i].zSp
1a0d0 61 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  an;.        if( 
1a0e0 41 4c 57 41 59 53 28 7a 53 70 61 6e 29 20 29 7b  ALWAYS(zSpan) ){
1a0f0 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74  .          pList
1a100 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
1a110 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
1a120 62 2c 20 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  b, zSpan);.     
1a130 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a140 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
1a150 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1a160 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
1a170 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1a180 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
1a190 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1a1a0 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1a1b0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
1a1c0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1a1d0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1a1e0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1a1f0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1a200 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1a210 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1a220 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1a230 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
1a240 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rBy ){.      ass
1a250 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
1a260 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
1a270 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
1a280 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
1a290 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
1a2a0 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
1a2b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1a2c0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1a2d0 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
1a2e0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1a2f0 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
1a300 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1a310 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1a320 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
1a330 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
1a340 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
1a350 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
1a360 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
1a370 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
1a380 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1a390 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
1a3a0 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
1a3b0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
1a3c0 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
1a3d0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1a3e0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
1a3f0 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1a400 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
1a410 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1a420 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1a430 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1a440 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1a450 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1a460 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1a470 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
1a480 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1a490 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1a4a0 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a4d0 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1a4e0 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
1a4f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1a500 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
1a510 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1a520 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1a530 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1a540 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
1a550 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
1a560 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
1a570 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1a580 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1a590 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
1a5a0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1a5b0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1a5c0 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
1a5d0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1a5e0 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
1a5f0 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
1a600 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
1a610 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
1a620 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
1a630 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
1a640 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1a650 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1a660 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
1a670 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
1a680 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
1a690 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
1a6a0 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
1a6b0 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
1a6c0 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
1a6d0 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
1a6e0 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
1a6f0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1a700 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
1a710 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
1a720 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
1a730 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
1a740 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
1a750 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
1a760 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
1a770 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
1a780 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
1a790 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
1a7a0 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
1a7b0 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
1a7c0 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
1a7d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1a7e0 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
1a7f0 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
1a800 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
1a810 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
1a820 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
1a830 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1a840 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
1a850 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
1a860 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1a870 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1a880 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1a890 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1a8a0 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
1a8b0 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
1a8c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1a8d0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
1a8e0 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
1a8f0 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29  it.** is a min()
1a900 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
1a910 20 52 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   Return WHERE_OR
1a920 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45  DERBY_MIN or WHE
1a930 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 69  RE_ORDERBY_MAX i
1a940 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20  f .** it is, or 
1a950 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41 74 20  0 otherwise. At 
1a960 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65 72 79  present, a query
1a970 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
1a980 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f  o be.** a min()/
1a990 6d 61 78 28 29 20 71 75 65 72 79 20 69 66 3a 0a  max() query if:.
1a9a0 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65 72 65  **.**   1. There
1a9b0 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a   is a single obj
1a9c0 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ect in the FROM 
1a9d0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
1a9e0 32 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69  2. There is a si
1a9f0 6e 67 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ngle expression 
1aa00 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1aa10 74 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20  t, and it is.** 
1aa20 20 20 20 20 20 65 69 74 68 65 72 20 6d 69 6e 28       either min(
1aa30 78 29 20 6f 72 20 6d 61 78 28 78 29 2c 20 77 68  x) or max(x), wh
1aa40 65 72 65 20 78 20 69 73 20 61 20 63 6f 6c 75 6d  ere x is a colum
1aa50 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a  n reference..*/.
1aa60 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78  static u8 minMax
1aa70 51 75 65 72 79 28 53 65 6c 65 63 74 20 2a 70 29  Query(Select *p)
1aa80 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
1aa90 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1aaa0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
1aab0 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ..  if( pEList->
1aac0 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
1aad0 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
1aae0 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20  NORMAL;.  pExpr 
1aaf0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  = pEList->a[0].p
1ab00 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
1ab10 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
1ab20 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
1ab30 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 45  0;.  if( NEVER(E
1ab40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ab50 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1ab60 63 74 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ct)) ) return 0;
1ab70 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70  .  pEList = pExp
1ab80 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66  r->x.pList;.  if
1ab90 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  ( pEList==0 || p
1aba0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
1abb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1abc0 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ( pEList->a[0].p
1abd0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
1abe0 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
1abf0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
1ac00 4f 52 4d 41 4c 3b 0a 20 20 61 73 73 65 72 74 28  ORMAL;.  assert(
1ac10 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1ac20 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1ac30 61 6c 75 65 29 20 29 3b 0a 20 20 69 66 28 20 73  alue) );.  if( s
1ac40 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
1ac50 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
1ac60 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  in")==0 ){.    r
1ac70 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1ac80 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65  RBY_MIN;.  }else
1ac90 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1aca0 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
1acb0 6b 65 6e 2c 22 6d 61 78 22 29 3d 3d 30 20 29 7b  ken,"max")==0 ){
1acc0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52  .    return WHER
1acd0 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
1ace0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 48 45 52   }.  return WHER
1acf0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1ad00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1ad10 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
1ad20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1ad30 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1ad40 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
1ad50 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
1ad60 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74 68 65  d argment is the
1ad70 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72   associated aggr
1ad80 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63  egate-info objec
1ad90 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  t. This .** func
1ada0 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68  tion tests if th
1adb0 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
1adc0 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
1add0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1ade0 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a   FROM <tbl>.**.*
1adf0 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73  * where table is
1ae00 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
1ae10 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c  e, not a sub-sel
1ae20 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20  ect or view. If 
1ae30 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65  the query.** doe
1ae40 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74  s match this pat
1ae50 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69  tern, then a poi
1ae60 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
1ae70 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  e object represe
1ae80 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69  nting.** <tbl> i
1ae90 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1aea0 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
1aeb0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1aec0 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43  Table *isSimpleC
1aed0 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  ount(Select *p, 
1aee0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1aef0 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  o){.  Table *pTa
1af00 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  b;.  Expr *pExpr
1af10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  ;..  assert( !p-
1af20 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20  >pGroupBy );..  
1af30 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c  if( p->pWhere ||
1af40 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
1af50 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70  r!=1 .   || p->p
1af60 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20  Src->nSrc!=1 || 
1af70 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
1af80 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72  elect.  ){.    r
1af90 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1afa0 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
1afb0 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70  [0].pTab;.  pExp
1afc0 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
1afd0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  [0].pExpr;.  ass
1afe0 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54  ert( pTab && !pT
1aff0 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70  ab->pSelect && p
1b000 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49  Expr );..  if( I
1b010 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1b020 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1b030 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
1b040 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
1b050 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
1b060 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
1b070 5d 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 26 53  ].pFunc->flags&S
1b080 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54  QLITE_FUNC_COUNT
1b090 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
1b0a0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
1b0b0 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20  ags&EP_Distinct 
1b0c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
1b0d0 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
1b0e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72  *.** If the sour
1b0f0 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73  ce-list item pas
1b100 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
1b110 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64  nt was augmented
1b120 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45   with an.** INDE
1b130 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
1b140 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74  hen try to locat
1b150 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1b160 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a  index. If there.
1b170 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c  ** was such a cl
1b180 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d  ause and the nam
1b190 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  ed index cannot 
1b1a0 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
1b1b0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
1b1c0 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  R and leave an e
1b1d0 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20  rror in pParse. 
1b1e0 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c  Otherwise, popul
1b1f0 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70  ate .** pFrom->p
1b200 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e  Index and return
1b210 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
1b220 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  nt sqlite3Indexe
1b230 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20  dByLookup(Parse 
1b240 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
1b250 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1b260 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
1b270 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d  m->pTab && pFrom
1b280 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->zIndex ){.    
1b290 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
1b2a0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63  rom->pTab;.    c
1b2b0 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46  har *zIndex = pF
1b2c0 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20  rom->zIndex;.   
1b2d0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
1b2e0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
1b2f0 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20  >pIndex; .      
1b300 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65    pIdx && sqlite
1b310 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a  3StrICmp(pIdx->z
1b320 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a  Name, zIndex); .
1b330 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
1b340 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
1b350 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
1b360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1b370 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1b380 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
1b390 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a  s", zIndex, 0);.
1b3a0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68        pParse->ch
1b3b0 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
1b3c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b3d0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
1b3e0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65      pFrom->pInde
1b3f0 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20  x = pIdx;.  }.  
1b400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1b420 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c  routine is a Wal
1b430 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ker callback for
1b440 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53   "expanding" a S
1b450 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1b460 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20  .** "Expanding" 
1b470 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20  means to do the 
1b480 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1b490 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
1b4a0 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
1b4b0 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
1b4c0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
1b4d0 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
1b4e0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
1b4f0 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
1b500 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
1b510 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
1b520 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
1b530 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
1b540 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
1b550 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
1b560 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
1b570 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
1b580 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
1b590 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
1b5a0 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
1b5b0 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
1b5c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1b5d0 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
1b5e0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
1b5f0 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
1b600 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
1b610 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
1b620 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
1b630 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
1b640 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
1b650 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
1b660 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
1b670 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
1b680 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
1b690 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
1b6a0 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
1b6b0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
1b6c0 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
1b6d0 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
1b6e0 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
1b6f0 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
1b700 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
1b710 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
1b720 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
1b730 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
1b740 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
1b750 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
1b760 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
1b770 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
1b780 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
1b790 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
1b7a0 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
1b7b0 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
1b7c0 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
1b7d0 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
1b7e0 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
1b7f0 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
1b800 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
1b810 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
1b820 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
1b830 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
1b840 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
1b850 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
1b860 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
1b870 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
1b880 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1b890 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
1b8a0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1b8b0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
1b8c0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
1b8d0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1b8e0 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
1b8f0 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
1b900 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1b910 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
1b920 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1b930 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
1b940 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
1b950 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1b960 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
1b970 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
1b980 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
1b990 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30   SF_Expanded)!=0
1b9a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1b9b0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
1b9c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1b9d0 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54  F_Expanded;.  pT
1b9e0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1b9f0 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
1ba00 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61  pEList;..  /* Ma
1ba10 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
1ba20 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
1ba30 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
1ba40 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
1ba50 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ba60 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
1ba70 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
1ba80 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1ba90 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
1baa0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
1bab0 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
1bac0 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
1bad0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1bae0 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
1baf0 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
1bb00 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
1bb10 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
1bb20 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
1bb30 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
1bb40 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
1bb50 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
1bb60 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
1bb70 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
1bb80 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
1bb90 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
1bba0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
1bbb0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1bbc0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
1bbd0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
1bbe0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
1bbf0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
1bc00 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
1bc10 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1bc20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
1bc30 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
1bc40 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
1bc50 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
1bc60 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
1bc70 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1bc80 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  une;.    }.    i
1bc90 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
1bca0 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
1bcb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1bcc0 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
1bcd0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
1bce0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
1bcf0 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
1bd00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1bd10 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
1bd20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
1bd30 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
1bd40 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
1bd50 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
1bd60 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1bd70 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
1bd80 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
1bd90 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
1bda0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1bdb0 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
1bdc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
1bdd0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
1bde0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
1bdf0 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
1be00 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
1be10 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1be20 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75  f(db, "sqlite_su
1be30 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
1be40 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20  id*)pTab);.     
1be50 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
1be60 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70  rior ){ pSel = p
1be70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20  Sel->pPrior; }. 
1be80 20 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d       selectColum
1be90 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
1bea0 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c  Parse, pSel->pEL
1beb0 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
1bec0 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
1bed0 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65        pTab->iPKe
1bee0 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54  y = -1;.      pT
1bef0 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30  ab->nRowEst = 10
1bf00 30 30 30 30 30 3b 0a 20 20 20 20 20 20 70 54 61  00000;.      pTa
1bf10 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
1bf20 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e  F_Ephemeral;.#en
1bf30 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
1bf40 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
1bf50 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
1bf60 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
1bf70 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
1bf80 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
1bf90 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
1bfa0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
1bfb0 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
1bfc0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
1bfd0 62 6c 65 28 70 50 61 72 73 65 2c 30 2c 70 46 72  ble(pParse,0,pFr
1bfe0 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d  om->zName,pFrom-
1bff0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
1c000 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
1c010 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1c020 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  t;.      pTab->n
1c030 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69  Ref++;.#if !defi
1c040 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1c050 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
1c060 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
1c070 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
1c080 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
1c090 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61  lect || IsVirtua
1c0a0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
1c0b0 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
1c0c0 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
1c0d0 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
1c0e0 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
1c0f0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c100 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
1c110 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
1c120 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
1c130 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ort;.        ass
1c140 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
1c150 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
1c160 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
1c170 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
1c180 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
1c190 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
1c1a0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
1c1b0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46  lect(pWalker, pF
1c1c0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
1c1d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1c1e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
1c1f0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
1c200 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
1c210 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
1c220 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
1c230 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
1c240 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
1c250 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
1c260 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1c270 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c280 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
1c290 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
1c2a0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1c2b0 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
1c2c0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
1c2d0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
1c2e0 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
1c2f0 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
1c300 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1c310 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
1c320 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
1c330 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
1c340 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
1c350 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
1c360 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
1c370 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
1c380 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
1c390 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
1c3a0 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
1c3b0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
1c3c0 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
1c3d0 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
1c3e0 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
1c3f0 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
1c400 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ALL operator for
1c410 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
1c420 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
1c430 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a  olumn list..  **
1c440 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
1c450 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
1c460 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c  locate the TK_AL
1c470 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  L expressions an
1c480 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61  d expand.  ** ea
1c490 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
1c4a0 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
1c4b0 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
1c4c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
1c4d0 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
1c4e0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
1c4f0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
1c500 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
1c510 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
1c520 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
1c530 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
1c540 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
1c550 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69   Expr *pE = pELi
1c560 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  st->a[k].pExpr;.
1c570 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
1c580 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
1c590 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
1c5a0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
1c5b0 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
1c5c0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
1c5d0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45  p!=TK_DOT || (pE
1c5e0 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45  ->pLeft!=0 && pE
1c5f0 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
1c600 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ID) );.    if( p
1c610 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
1c620 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
1c630 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
1c640 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c  .  }.  if( k<pEL
1c650 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
1c660 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
1c670 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
1c680 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
1c690 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
1c6a0 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
1c6b0 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
1c6c0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
1c6d0 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
1c6e0 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
1c6f0 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
1c700 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
1c710 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
1c720 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
1c730 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
1c740 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
1c750 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
1c760 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
1c770 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
1c780 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
1c790 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
1c7a0 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
1c7b0 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
1c7c0 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20  Names)!=0.      
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
1c7f0 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
1c800 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
1c810 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
1c820 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
1c830 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
1c840 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
1c850 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
1c860 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
1c870 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht!=0 );.      i
1c880 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
1c890 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b  L && (pE->op!=TK
1c8a0 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
1c8b0 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
1c8c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1c8d0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
1c8e0 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
1c8f0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
1c900 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
1c910 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
1c920 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1c930 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1c940 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
1c950 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1c960 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
1c970 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
1c980 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
1c990 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
1c9a0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
1c9b0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
1c9c0 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
1c9d0 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
1c9e0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
1c9f0 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
1ca00 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1ca10 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
1ca20 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1ca30 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
1ca40 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
1ca50 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
1ca60 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
1ca70 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
1ca80 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
1ca90 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
1caa0 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
1cab0 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
1cac0 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
1cad0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
1cae0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
1caf0 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
1cb00 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
1cb10 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
1cb20 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
1cb30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
1cb40 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20  >pLeft!=0 );.   
1cb50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1cb60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1cb70 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e  pE->pLeft, EP_In
1cb80 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1cb90 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45       zTName = pE
1cba0 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
1cbb0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
1cbc0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
1cbd0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
1cbe0 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
1cbf0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
1cc00 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
1cc10 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
1cc20 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
1cc30 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1cc40 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
1cc50 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
1cc60 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
1cc70 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
1cc80 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
1cc90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
1cca0 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
1ccb0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
1ccc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1ccd0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1cce0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
1ccf0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
1cd00 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1cd10 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
1cd20 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
1cd30 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1cd40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1cd50 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
1cd60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 1;.          f
1cd70 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
1cd80 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
1cd90 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
1cda0 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  xpr, *pRight;.  
1cdb0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1cdc0 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
1cdd0 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
1cde0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1cdf0 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
1ce00 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
1ce10 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
1ce20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
1ce30 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
1ce40 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
1ce50 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
1ce60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
1ce70 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
1ce80 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
1ce90 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
1cea0 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
1ceb0 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
1cec0 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
1ced0 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74  hidden' (current
1cee0 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  ly only possible
1cef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1cf00 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  for virtual tabl
1cf10 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c  es), do not incl
1cf20 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78  ude it in the ex
1cf30 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
1cf40 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
1cf50 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20   list..         
1cf60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1cf70 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f    if( IsHiddenCo
1cf80 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c  lumn(&pTab->aCol
1cf90 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
1cfa0 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56        assert(IsV
1cfb0 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20  irtual(pTab));. 
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1cfd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1cfe0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1cff0 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
1d000 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
1d010 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
1d020 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  om->jointype & J
1d030 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20  T_NATURAL)!=0.  
1d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
1d050 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
1d060 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69  ndex(pTabList, i
1d070 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20  , zName, 0, 0). 
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0a0 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
1d0b0 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
1d0c0 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
1d0d0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
1d0e0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74        ** table t
1d0f0 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74  o the right of t
1d100 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20  he join */.     
1d110 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1d120 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1d130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1d140 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
1d150 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d  ListIndex(pFrom-
1d160 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  >pUsing, zName)>
1d170 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1d180 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
1d190 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
1d1a0 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
1d1b0 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
1d1d0 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
1d1e0 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
1d1f0 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
1d200 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1d210 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1d220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d230 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d240 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
1d250 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
1d260 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1d270 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a      zColname = z
1d280 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
1d290 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20    zToFree = 0;. 
1d2a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
1d2b0 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
1d2c0 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1d2e0 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr *pLeft;.     
1d2f0 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
1d300 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1d310 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65   TK_ID, zTabName
1d320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1d330 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
1d340 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1d350 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
1d360 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
1d370 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
1d380 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
1d390 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
1d3a0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1d3b0 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a  f(db, "%s.%s", z
1d3c0 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  TabName, zName);
1d3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d3e0 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e   zToFree = zColn
1d3f0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
1d400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1d410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d420 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
1d430 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
1d440 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d450 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1d460 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1d470 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
1d480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1d490 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c  Colname.z = zCol
1d4a0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
1d4b0 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73    sColname.n = s
1d4c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1d4d0 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
1d4e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d4f0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
1d500 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
1d510 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
1d520 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1d530 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29  ree(db, zToFree)
1d540 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d560 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
1d570 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1d580 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zTName ){.      
1d590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1d5a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1d5b0 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
1d5c0 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ", zTName);.    
1d5d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d5e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d5f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d600 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63   "no tables spec
1d610 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20  ified");.       
1d620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1d630 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d640 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1d650 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73  Delete(db, pELis
1d660 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
1d670 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69  t = pNew;.  }.#i
1d680 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
1d690 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c  UMN.  if( p->pEL
1d6a0 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74  ist && p->pEList
1d6b0 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d  ->nExpr>db->aLim
1d6c0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1d6d0 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
1d6e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1d6f0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
1d700 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
1d710 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65  lt set");.  }.#e
1d720 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52  ndif.  return WR
1d730 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
1d740 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
1d750 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
1d760 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a  -tree walker..**
1d770 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
1d780 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c  utine is the Wal
1d790 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
1d7a0 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  k then expressio
1d7b0 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77  n trees.** are w
1d7c0 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e  alked without an
1d7d0 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20  y actions being 
1d7e0 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f  taken at each no
1d7f0 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c  de.  Presumably,
1d800 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
1d810 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
1d820 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  r Walker.xExprCa
1d830 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20  llback then .** 
1d840 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
1d850 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f  llback is set to
1d860 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73   do something us
1d870 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a  eful for every .
1d880 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
1d890 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
1d8a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
1d8b0 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  prWalkNoop(Walke
1d8c0 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72  r *NotUsed, Expr
1d8d0 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
1d8e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
1d8f0 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
1d900 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
1d910 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
1d920 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d930 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45  e "expands" a SE
1d940 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
1d950 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75  nd all of its su
1d960 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72  bqueries..** For
1d970 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1d980 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20  rmation on what 
1d990 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70  it means to "exp
1d9a0 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a  and" a SELECT.**
1d9b0 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20   statement, see 
1d9c0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
1d9d0 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20  he selectExpand 
1d9e0 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  worker callback 
1d9f0 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70  above..**.** Exp
1da00 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20  anding a SELECT 
1da10 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65  statement is the
1da20 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70   first step in p
1da30 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53  rocessing a.** S
1da40 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1da50 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61    The SELECT sta
1da60 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65  tement must be e
1da70 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a  xpanded before.*
1da80 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  * name resolutio
1da90 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  n is performed..
1daa0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e  **.** If anythin
1dab0 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e  g goes wrong, an
1dac0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1dad0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  s written into p
1dae0 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61  Parse..** The ca
1daf0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  lling function c
1db00 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72  an detect the pr
1db10 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67  oblem by looking
1db20 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   at pParse->nErr
1db30 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73  .** and/or pPars
1db40 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1db50 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
1db60 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1db70 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70  tExpand(Parse *p
1db80 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
1db90 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65  Select){.  Walke
1dba0 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  r w;.  w.xSelect
1dbb0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
1dbc0 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78  tExpander;.  w.x
1dbd0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
1dbe0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
1dbf0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
1dc00 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
1dc10 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
1dc20 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  t);.}...#ifndef 
1dc30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1dc40 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  UERY./*.** This 
1dc50 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c  is a Walker.xSel
1dc60 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c  ectCallback call
1dc70 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c  back for the sql
1dc80 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e  ite3SelectTypeIn
1dc90 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  fo().** interfac
1dca0 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  e..**.** For eac
1dcb0 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  h FROM-clause su
1dcc0 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75  bquery, add Colu
1dcd0 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c  mn.zType and Col
1dce0 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66  umn.zColl.** inf
1dcf0 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  ormation to the 
1dd00 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
1dd10 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
1dd20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  the result set.*
1dd30 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65  * of that subque
1dd40 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61  ry..**.** The Ta
1dd50 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
1dd60 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
1dd70 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73  e result set was
1dd80 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20   constructed.** 
1dd90 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  by selectExpande
1dda0 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65  r() but the type
1ddb0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
1ddc0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f  nformation was o
1ddd0 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61  mitted.** at tha
1dde0 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20  t point because 
1ddf0 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20  identifiers had 
1de00 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73  not yet been res
1de10 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20  olved.  This.** 
1de20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1de30 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69  d after identifi
1de40 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  er resolution..*
1de50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
1de60 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
1de70 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70  peInfo(Walker *p
1de80 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
1de90 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
1dea0 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rse;.  int i;.  
1deb0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1dec0 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
1ded0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
1dee0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ..  assert( p->s
1def0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
1df00 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28  olved );.  if( (
1df10 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1df20 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
1df30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
1df40 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70  ags |= SF_HasTyp
1df50 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73  eInfo;.    pPars
1df60 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
1df70 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  rse;.    pTabLis
1df80 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
1df90 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
1dfa0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
1dfb0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1dfc0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
1dfd0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1dfe0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
1dff0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
1e000 70 54 61 62 21 3d 30 29 20 26 26 20 28 70 54 61  pTab!=0) && (pTa
1e010 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
1e020 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29  _Ephemeral)!=0 )
1e030 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  {.        /* A s
1e040 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
1e050 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1e060 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
1e070 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
1e080 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
1e090 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e0a0 28 20 70 53 65 6c 20 29 3b 0a 20 20 20 20 20 20  ( pSel );.      
1e0b0 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
1e0c0 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70  Prior ) pSel = p
1e0d0 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
1e0e0 20 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f       selectAddCo
1e0f0 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
1e100 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
1e110 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61  b->nCol, pTab->a
1e120 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  Col, pSel);.    
1e130 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1e140 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1e150 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  nue;.}.#endif...
1e160 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e170 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65  ne adds datatype
1e180 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
1e190 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  equence informat
1e1a0 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61  ion to.** the Ta
1e1b0 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f  ble structures o
1e1c0 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  f all FROM-claus
1e1d0 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  e subqueries in 
1e1e0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
1e1f0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  ement..**.** Use
1e200 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66   this routine af
1e210 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
1e220 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1e230 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1e240 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72  tAddTypeInfo(Par
1e250 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
1e260 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69  ct *pSelect){.#i
1e270 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e280 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c  T_SUBQUERY.  Wal
1e290 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65  ker w;.  w.xSele
1e2a0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
1e2b0 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
1e2c0 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
1e2d0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
1e2e0 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
1e2f0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1e300 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
1e310 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
1e320 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
1e330 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1e340 65 74 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ets of a SELECT 
1e350 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
1e360 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a  ocessing.  The.*
1e370 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  * following is a
1e380 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a  ccomplished:.**.
1e390 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43  **     *  VDBE C
1e3a0 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
1e3b0 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  e assigned to al
1e3c0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  l FROM-clause te
1e3d0 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45  rms..**     *  E
1e3e0 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
1e3f0 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
1e400 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d  ed for all FROM-
1e410 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
1e420 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20  s..**     *  ON 
1e430 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
1e440 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e  s are shifted in
1e450 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65  to WHERE stateme
1e460 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69  nts.**     *  Wi
1e470 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20  ldcards "*" and 
1e480 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73  "TABLE.*" in res
1e490 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70  ult sets are exp
1e4a0 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  anded..**     * 
1e4b0 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   Identifiers in 
1e4c0 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d  expression are m
1e4d0 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73  atched to tables
1e4e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1e4f0 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73  tine acts recurs
1e500 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62  ively on all sub
1e510 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74  queries within t
1e520 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
1e530 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
1e540 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Prep(.  Parse *p
1e550 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
1e560 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
1e570 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1e580 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1e590 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
1e5a0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
1e5b0 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
1e5c0 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
1e5d0 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
1e5e0 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20  t for container 
1e5f0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1e600 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  *db;.  if( NEVER
1e610 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (p==0) ) return;
1e620 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1e630 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  db;.  if( p->sel
1e640 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
1e650 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b  peInfo ) return;
1e660 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1e670 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70  Expand(pParse, p
1e680 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1e690 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
1e6a0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1e6b0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
1e6c0 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
1e6d0 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
1e6e0 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
1e6f0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1e700 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1e710 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1e720 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
1e730 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a  o(pParse, p);.}.
1e740 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
1e750 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
1e760 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ulator..**.** Th
1e770 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
1e780 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74  mulator is a set
1e790 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
1e7a0 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e   that hold.** in
1e7b0 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
1e7c0 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61  ts while calcula
1e7d0 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ting an aggregat
1e7e0 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  e.  This.** rout
1e7f0 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65  ine simply store
1e800 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f  s NULLs in all o
1e810 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63  f those memory c
1e820 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
1e830 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75  void resetAccumu
1e840 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
1e850 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
1e860 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
1e870 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1e880 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
1e890 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
1e8a0 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28  nc *pFunc;.  if(
1e8b0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
1e8c0 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  +pAggInfo->nColu
1e8d0 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  mn==0 ){.    ret
1e8e0 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  urn;.  }.  for(i
1e8f0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
1e900 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1e910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e920 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1e930 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   0, pAggInfo->aC
1e940 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d  ol[i].iMem);.  }
1e950 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
1e960 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
1e970 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
1e980 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
1e990 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1e9a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e9b0 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d  _Null, 0, pFunc-
1e9c0 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  >iMem);.    if( 
1e9d0 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
1e9e0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
1e9f0 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
1ea00 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
1ea10 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1ea20 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
1ea30 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
1ea40 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
1ea50 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
1ea60 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
1ea70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1ea80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1ea90 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
1eaa0 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
1eab0 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
1eac0 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
1ead0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
1eae0 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
1eaf0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1eb00 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
1eb10 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
1eb20 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1eb30 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
1eb40 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ist);.        sq
1eb50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1eb60 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1eb70 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
1eb80 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1ebb0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
1ebc0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
1ebd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1ebe0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
1ebf0 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
1ec00 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
1ec10 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
1ec20 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
1ec30 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1ec40 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1ec50 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
1ec60 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
1ec70 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1ec80 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1ec90 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1eca0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1ecb0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1ecc0 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
1ecd0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
1ece0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
1ecf0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
1ed00 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
1ed10 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
1ed20 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
1ed30 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
1ed40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
1ed50 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
1ed60 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71  elect) );.    sq
1ed70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1ed80 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
1ed90 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20  pF->iMem, pList 
1eda0 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
1edb0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1edd0 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
1ede0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  4_FUNCDEF);.  }.
1edf0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
1ee00 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
1ee10 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
1ee20 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
1ee30 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
1ee40 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
1ee50 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
1ee60 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
1ee70 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
1ee80 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
1ee90 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
1eea0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1eeb0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1eec0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1eed0 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
1eee0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
1eef0 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
1ef00 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
1ef10 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1ef20 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
1ef30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
1ef40 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1ef50 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1ef60 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
1ef70 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
1ef80 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
1ef90 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
1efa0 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
1efb0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
1efc0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1efd0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1efe0 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
1eff0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1f000 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ct) );.    if( p
1f010 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
1f020 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
1f030 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
1f040 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1f050 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
1f060 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
1f070 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
1f080 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
1f090 2c 20 72 65 67 41 67 67 2c 20 31 29 3b 0a 20 20  , regAgg, 1);.  
1f0a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1f0b0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Arg = 0;.      r
1f0c0 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d  egAgg = 0;.    }
1f0d0 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69  .    if( pF->iDi
1f0e0 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
1f0f0 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
1f100 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1f110 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73  el(v);.      ass
1f120 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
1f130 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
1f140 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
1f150 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
1f160 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
1f170 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
1f180 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26  ->pFunc->flags &
1f190 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
1f1a0 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
1f1b0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1f1c0 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
1f1d0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1f1e0 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
1f1f0 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
1f200 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
1f210 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
1f220 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
1f230 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
1f240 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
1f250 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
1f260 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
1f270 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
1f280 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1f290 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1f2a0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
1f2b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f2c0 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
1f2d0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
1f2e0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1f2f0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1f300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f310 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
1f320 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
1f330 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
1f340 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
1f350 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f360 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
1f370 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
1f380 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1f3a0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
1f3b0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
1f3c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1f3d0 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
1f3e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1f3f0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1f400 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
1f410 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
1f420 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1f430 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1f440 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
1f450 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
1f460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1f470 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f480 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
1f490 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f4a0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
1f4b0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
1f4c0 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
1f4d0 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
1f4e0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
1f4f0 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
1f500 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
1f510 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
1f520 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
1f530 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
1f540 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
1f550 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
1f560 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
1f570 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
1f580 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
1f590 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
1f5a0 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
1f5b0 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
1f5c0 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
1f5d0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
1f5e0 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
1f5f0 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
1f600 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
1f610 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
1f620 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
1f630 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
1f640 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
1f650 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
1f660 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
1f670 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
1f680 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
1f690 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
1f6a0 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
1f6b0 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
1f6c0 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
1f6d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f6e0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
1f6f0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
1f700 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
1f710 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
1f720 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
1f730 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1f740 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1f750 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
1f760 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
1f770 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1f780 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
1f790 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
1f7a0 50 61 72 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parse);.}../*.**
1f7b0 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50   Add a single OP
1f7c0 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
1f7d0 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45  tion to the VDBE
1f7e0 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69   to explain a si
1f7f0 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29  mple.** count(*)
1f800 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20   query ("SELECT 
1f810 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54  count(*) FROM pT
1f820 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ab")..*/.#ifndef
1f830 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
1f840 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64  LAIN.static void
1f850 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
1f860 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  unt(.  Parse *pP
1f870 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
1f880 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
1f890 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
1f8a0 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f8c0 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
1f8d0 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ied */.  Index *
1f8e0 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
1f8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1f900 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  x used to optimi
1f910 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c  ze scan, or NULL
1f920 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61   */.){.  if( pPa
1f930 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
1f940 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71  ){.    char *zEq
1f950 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  p = sqlite3MPrin
1f960 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
1f970 53 43 41 4e 20 54 41 42 4c 45 20 25 73 20 25 73  SCAN TABLE %s %s
1f980 25 73 28 7e 25 64 20 72 6f 77 73 29 22 2c 0a 20  %s(~%d rows)",. 
1f990 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
1f9a0 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 49 64  me, .        pId
1f9b0 78 20 3f 20 22 55 53 49 4e 47 20 43 4f 56 45 52  x ? "USING COVER
1f9c0 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22  ING INDEX " : ""
1f9d0 2c 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f  ,.        pIdx ?
1f9e0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
1f9f0 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
1fa00 3e 6e 52 6f 77 45 73 74 0a 20 20 20 20 29 3b 0a  >nRowEst.    );.
1fa10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1fa20 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70  ddOp4(.        p
1fa30 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1fa40 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
1fa50 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
1fa60 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41  0, zEqp, P4_DYNA
1fa70 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  MIC.    );.  }.}
1fa80 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1fa90 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
1faa0 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  nt(a,b,c).#endif
1fab0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1fac0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
1fad0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
1fae0 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
1faf0 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
1fb00 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1fb10 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
1fb20 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
1fb30 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
1fb40 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1fb50 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
1fb60 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
1fb70 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73  by argument pDes
1fb80 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t.** as follows:
1fb90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74  .**.**     pDest
1fba0 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75 6c  ->eDest    Resul
1fbb0 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
1fbc0 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
1fbd0 2d 2d 2d 2d 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 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
1fc00 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e 65  Output      Gene
1fc10 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75  rate a row of ou
1fc20 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65 20  tput (using the 
1fc30 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20  OP_ResultRow.** 
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc50 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20      opcode) for 
1fc60 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
1fc70 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a  result set..**.*
1fc80 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
1fc90 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64        Only valid
1fca0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
1fcb0 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  s a single colum
1fcc0 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n..**           
1fcd0 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20            Store 
1fce0 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
1fcf0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
1fd00 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20  sult row.**     
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
1fd30 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20 61 62  t->iParm then ab
1fd40 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a  andon the rest.*
1fd50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1fd60 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65        of the que
1fd70 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e  ry.  This destin
1fd80 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c  ation implies "L
1fd90 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20  IMIT 1"..**.**  
1fda0 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
1fdb0 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75     The result mu
1fdc0 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
1fdd0 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61  olumn.  Store ea
1fde0 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ch.**           
1fdf0 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66            row of
1fe00 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b   result as the k
1fe10 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73  ey in table pDes
1fe20 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20  t->iParm. .**   
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe40 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66 69    Apply the affi
1fe50 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69  nity pDest->affi
1fe60 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72  nity before stor
1fe70 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1fe80 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
1fe90 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70  ts.  Used to imp
1fea0 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45  lement "IN (SELE
1feb0 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20  CT ...)"..**.** 
1fec0 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
1fed0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
1fee0 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
1fef0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1ff00 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1ff10 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
1ff20 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
1ff30 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
1ff40 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1ff50 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1ff60 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
1ff70 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
1ff80 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
1ff90 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
1ffa0 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20  iParm..**       
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
1ffc0 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45  is is like SRT_E
1ffd0 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20 74  phemTab except t
1ffe0 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  hat the table.**
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20000 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64 20       is assumed 
20010 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70  to already be op
20020 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  en..**.**     SR
20030 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72  T_EphemTab    Cr
20040 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72  eate an temporar
20050 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
20060 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a  Parm and store.*
20070 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20080 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74        the result
20090 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73   there. The curs
200a0 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20  or is left open 
200b0 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  after.**        
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
200d0 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73  urning.  This is
200e0 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20   like SRT_Table 
200f0 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20  except that.**  
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20110 20 20 20 74 68 69 73 20 64 65 73 74 69 6e 61 74     this destinat
20120 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e  ion uses OP_Open
20130 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65  Ephemeral to cre
20140 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ate.**          
20150 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74             the t
20160 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a  able first..**.*
20170 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74  *     SRT_Corout
20180 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20 61  ine   Generate a
20190 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
201a0 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72   returns a new r
201b0 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  ow of.**        
201c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
201d0 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20 69  ults each time i
201e0 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54  t is invoked.  T
201f0 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a  he entry point.*
20200 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20210 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d        of the co-
20220 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65  routine is store
20230 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44  d in register pD
20240 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
20250 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73  *     SRT_Exists
20260 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20        Store a 1 
20270 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
20280 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74  Dest->iParm if t
20290 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20  he result.**    
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74   set is not empt
202c0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  y..**.**     SRT
202d0 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68 72  _Discard     Thr
202e0 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  ow the results a
202f0 77 61 79 2e 20 20 54 68 69 73 20 69 73 20 75 73  way.  This is us
20300 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20  ed by SELECT.** 
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20320 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20 77      statements w
20330 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 20 77  ithin triggers w
20340 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73  hose only purpos
20350 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  e is.**         
20360 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
20370 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f 66 20  side-effects of 
20380 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  functions..**.**
20390 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
203a0 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
203b0 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
203c0 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
203d0 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
203e0 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
203f0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
20400 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
20410 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
20420 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
20430 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
20440 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
20450 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
20460 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
20470 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
20480 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
20490 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
204a0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
204b0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
204c0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
204d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
204e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
204f0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
20500 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
20510 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
20520 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
20530 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
20540 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
20550 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
20560 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
20570 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20580 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
20590 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
205a0 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
205b0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
205c0 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
205e0 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
205f0 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
20600 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
20610 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
20620 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
20630 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
20640 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
20650 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
20660 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
20670 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
20680 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
20690 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
206a0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
206b0 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
206c0 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
206d0 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
206e0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
206f0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
20700 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
20710 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f   *pOrderBy;    /
20720 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
20730 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
20740 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
20750 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
20760 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
20770 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
20780 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
20790 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
207a0 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
207b0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
207c0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ULL */.  int isD
207d0 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
207e0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
207f0 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
20800 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
20810 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20  int distinct;   
20820 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
20830 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
20840 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20  istinct set */. 
20850 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
20860 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
20870 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
20880 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
20890 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49  .  int addrSortI
208a0 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64  ndex;     /* Add
208b0 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70  ress of an OP_Op
208c0 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
208d0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
208e0 20 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64   addrDistinctInd
208f0 65 78 3b 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ex; /* Address o
20900 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65  f an OP_OpenEphe
20910 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
20920 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  n */.  AggInfo s
20930 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
20940 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
20950 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
20960 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
20970 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
20980 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
20990 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
209a0 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
209b0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
209c0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
209d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
209e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
209f0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
20a00 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
20a10 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
20a20 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
20a30 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
20a40 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
20a50 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
20a60 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
20a70 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
20a80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
20a90 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
20aa0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
20ab0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
20ac0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
20ad0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
20ae0 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
20af0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
20b00 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
20b10 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
20b20 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72  ));..  if( Ignor
20b30 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
20b40 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
20b50 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
20b60 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
20b70 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
20b80 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
20b90 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
20ba0 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
20bb0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
20bc0 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20  T_Discard);.    
20bd0 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
20be0 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
20bf0 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
20c00 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
20c10 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
20c20 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
20c30 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
20c40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
20c50 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
20c60 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
20c70 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
20c80 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
20c90 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
20ca0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
20cb0 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
20cc0 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65  , p, 0);.  pOrde
20cd0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
20ce0 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
20cf0 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
20d00 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
20d10 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
20d20 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
20d30 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
20d40 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
20d50 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  }.  isAgg = (p->
20d60 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
20d70 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61  gregate)!=0;.  a
20d80 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
20d90 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
20da0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
20db0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
20dc0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
20dd0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
20de0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
20df0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
20e00 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
20e10 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
20e20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
20e30 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
20e40 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
20e50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20e60 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
20e70 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
20e80 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
20e90 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
20ea0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
20eb0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
20ec0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
20ed0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
20ee0 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
20ef0 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
20f00 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
20f10 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
20f20 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
20f30 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
20f40 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
20f50 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
20f60 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
20f70 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
20f80 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
20f90 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
20fa0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
20fb0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
20fc0 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
20fd0 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
20fe0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
20ff0 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
21000 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
21010 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21020 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72   if( pItem->addr
21030 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20  FillSub ){.     
21040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21050 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
21060 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
21070 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  , pItem->addrFil
21080 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 63 6f 6e  lSub);.      con
21090 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
210a0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
210b0 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
210c0 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
210d0 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
210e0 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
210f0 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74   refered to by t
21100 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
21110 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
21120 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
21130 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
21140 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
21150 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
21160 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
21170 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
21180 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
21190 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
211a0 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
211b0 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
211c0 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
211d0 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
211e0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
211f0 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
21200 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
21210 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
21220 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
21230 70 29 3b 0a 0a 20 20 20 20 69 73 41 67 67 53 75  p);..    isAggSu
21240 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c  b = (pSub->selFl
21250 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
21260 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  te)!=0;.    if( 
21270 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
21280 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73  pParse, p, i, is
21290 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29  Agg, isAggSub) )
212a0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
212b0 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
212c0 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74  absorbed into it
212d0 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  s parent. */.   
212e0 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20     if( isAggSub 
212f0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67  ){.        isAgg
21300 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
21310 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
21320 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20  Aggregate;.     
21330 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b   }.      i = -1;
21340 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21350 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
21360 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
21370 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68  will fill an eph
21380 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74  emeral table wit
21390 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  h.      ** the c
213a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73  ontent of this s
213b0 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d  ubquery.  pItem-
213c0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c  >addrFillSub wil
213d0 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  l point.      **
213e0 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
213f0 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
21400 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49   subroutine.  pI
21410 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20  tem->regReturn. 
21420 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67       ** is a reg
21430 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ister allocated 
21440 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72  to hold the subr
21450 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64  outine return ad
21460 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20  dress.      */. 
21470 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72       int topAddr
21480 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
21490 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
214a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f  ;.      int regO
214b0 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  nce = 0;.      a
214c0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64  ssert( pItem->ad
214d0 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a  drFillSub==0 );.
214e0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
214f0 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64  rFillSub = topAd
21500 64 72 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65  dr+1;.      pIte
21510 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
21520 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
21530 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
21540 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
21550 26 26 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67  && pParse->pTrig
21560 67 65 72 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  gerTab==0 ){.   
21570 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
21580 75 62 71 75 65 72 79 20 69 73 20 6e 6f 20 63 6f  ubquery is no co
21590 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20  rrelated and if 
215a0 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64  we are not insid
215b0 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
215c0 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20  a trigger, then 
215d0 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
215e0 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75  compute the valu
215f0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
21600 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63  y.        ** onc
21610 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  e. */.        re
21620 67 4f 6e 63 65 20 3d 20 2b 2b 70 50 61 72 73 65  gOnce = ++pParse
21630 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
21640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21650 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 4f  1(v, OP_If, regO
21660 6e 63 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nce);.        sq
21670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21680 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
21690 2c 20 72 65 67 4f 6e 63 65 29 3b 0a 20 20 20 20  , regOnce);.    
216a0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
216b0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
216c0 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
216d0 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
216e0 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  sor);.      expl
216f0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
21700 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
21710 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
21720 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
21730 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
21740 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
21750 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
21760 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  m->pTab->nRowEst
21770 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 53 75   = (unsigned)pSu
21780 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
21790 20 20 20 20 20 69 66 28 20 72 65 67 4f 6e 63 65       if( regOnce
217a0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
217b0 6d 70 48 65 72 65 28 76 2c 20 74 6f 70 41 64 64  mpHere(v, topAdd
217c0 72 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+1);.      sqli
217d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
217e0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65   OP_Return, pIte
217f0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
21800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21810 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 6f 70 41  JumpHere(v, topA
21820 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
21830 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21840 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
21850 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 74 6f 70  ->regReturn, top
21860 41 64 64 72 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  Addr+1);.    }. 
21870 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d     if( /*pParse-
21880 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d  >nErr ||*/ db->m
21890 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
218a0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
218b0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
218c0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
218d0 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  -= sqlite3Select
218e0 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20  ExprHeight(p);. 
218f0 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
21900 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21  >pSrc;.    if( !
21910 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
21920 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
21930 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
21940 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
21950 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d   }.  pEList = p-
21960 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a  >pEList;.#endif.
21970 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
21980 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
21990 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
219a0 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
219b0 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74  Having;.  isDist
219c0 69 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  inct = (p->selFl
219d0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
219e0 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t)!=0;..#ifndef 
219f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
21a00 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
21a10 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
21a20 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
21a30 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
21a40 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
21a50 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
21a60 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
21a70 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
21a80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ==0 ){.      Sel
21a90 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69  ect *pLoop, *pRi
21aa0 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ght = 0;.      i
21ab0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
21ac0 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a    int mxSelect;.
21ad0 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d        for(pLoop=
21ae0 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
21af0 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63  pLoop->pPrior, c
21b00 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  nt++){.        p
21b10 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  Loop->pRightmost
21b20 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c   = p;.        pL
21b30 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69  oop->pNext = pRi
21b40 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69  ght;.        pRi
21b50 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  ght = pLoop;.   
21b60 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c     }.      mxSel
21b70 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  ect = db->aLimit
21b80 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
21b90 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a  MPOUND_SELECT];.
21ba0 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65        if( mxSele
21bb0 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65  ct && cnt>mxSele
21bc0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
21bd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21be0 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
21bf0 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e  terms in compoun
21c00 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20  d SELECT");.    
21c10 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
21c20 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
21c30 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74   }.    rc = mult
21c40 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
21c50 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65  p, pDest);.    e
21c60 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
21c70 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
21c80 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
21c90 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72  ctId);.    retur
21ca0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
21cb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
21cc0 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20  is both a GROUP 
21cd0 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20  BY and an ORDER 
21ce0 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
21cf0 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e  ey are.  ** iden
21d00 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61  tical, then disa
21d10 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ble the ORDER BY
21d20 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68   clause since th
21d30 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20  e GROUP BY.  ** 
21d40 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65  will cause eleme
21d50 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20  nts to come out 
21d60 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
21d70 72 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20  rder.  This is. 
21d80 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   ** an optimizat
21d90 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63  ion - the correc
21da0 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20  t answer should 
21db0 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73  result regardles
21dc0 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20  s..  ** Use the 
21dd0 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
21de0 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
21df0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
21e00 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20  TIMIZER.  ** to 
21e10 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
21e20 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
21e30 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a  sting purposes..
21e40 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
21e50 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
21e60 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  e(p->pGroupBy, p
21e70 4f 72 64 65 72 42 79 29 3d 3d 30 0a 20 20 20 20  OrderBy)==0.    
21e80 20 20 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61       && (db->fla
21e90 67 73 20 26 20 53 51 4c 49 54 45 5f 47 72 6f 75  gs & SQLITE_Grou
21ea0 70 42 79 4f 72 64 65 72 29 3d 3d 30 20 29 7b 0a  pByOrder)==0 ){.
21eb0 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
21ec0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
21ed0 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54  he query is DIST
21ee0 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  INCT with an ORD
21ef0 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74  ER BY but is not
21f00 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61   an aggregate, a
21f10 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  nd .  ** if the 
21f20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74  select-list is t
21f30 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f  he same as the O
21f40 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68  RDER BY list, th
21f50 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  en this query.  
21f60 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
21f70 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42  ten as a GROUP B
21f80 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  Y. In other word
21f90 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  s, this:.  **.  
21fa0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  **     SELECT DI
21fb0 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20  STINCT xyz FROM 
21fc0 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a  ... ORDER BY xyz
21fd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72  .  **.  ** is tr
21fe0 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20  ansformed to:.  
21ff0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
22000 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
22010 47 52 4f 55 50 20 42 59 20 78 79 7a 0a 20 20 2a  GROUP BY xyz.  *
22020 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e  *.  ** The secon
22030 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72  d form is prefer
22040 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  red as a single 
22050 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74  index (or temp-t
22060 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20  able) may be .  
22070 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68  ** used for both
22080 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e   the ORDER BY an
22090 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  d DISTINCT proce
220a0 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e  ssing. As origin
220b0 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74  ally .  ** writt
220c0 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73  en the query mus
220d0 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62  t use a temp-tab
220e0 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  le for at least 
220f0 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52  one of the ORDER
22100 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49   .  ** BY and DI
22110 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69  STINCT, and an i
22120 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65  ndex or separate
22130 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
22140 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a  the other..  */.
22150 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
22160 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
22170 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
22180 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20  ==SF_Distinct . 
22190 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
221a0 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 4f 72 64  ListCompare(pOrd
221b0 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74 29  erBy, p->pEList)
221c0 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  ==0.  ){.    p->
221d0 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
221e0 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d  Distinct;.    p-
221f0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
22200 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
22210 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29  b, p->pEList, 0)
22220 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
22230 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
22240 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
22250 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
22260 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
22270 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
22280 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
22290 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
222a0 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
222b0 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
222c0 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
222d0 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
222e0 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
222f0 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
22300 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
22310 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
22320 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
22330 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
22340 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
22350 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
22360 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
22370 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
22380 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
22390 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
223a0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
223b0 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
223c0 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
223d0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
223e0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
223f0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
22400 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
22410 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
22420 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  e, pOrderBy);.  
22430 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
22440 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
22450 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64  Tab++;.    p->ad
22460 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
22470 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
22480 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22490 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
224a0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
224d0 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
224e0 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
224f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
22510 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
22520 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
22530 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22540 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
22550 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
22560 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
22570 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
22580 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
22590 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
225a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
225b0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
225c0 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
225d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
225e0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
225f0 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  al, pDest->iParm
22600 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
22610 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
22620 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
22630 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
22640 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
22650 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
22660 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 4c 41  Row = (double)LA
22670 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63  RGEST_INT64;.  c
22680 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
22690 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
226a0 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
226b0 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 61 64 64  iLimit==0 && add
226c0 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
226d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
226e0 47 65 74 4f 70 28 76 2c 20 61 64 64 72 53 6f 72  GetOp(v, addrSor
226f0 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20  tIndex)->opcode 
22700 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b  = OP_SorterOpen;
22710 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
22720 20 7c 3d 20 53 46 5f 55 73 65 53 6f 72 74 65 72   |= SF_UseSorter
22730 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
22740 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
22750 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
22760 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
22770 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
22780 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
22790 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  ct ){.    KeyInf
227a0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
227b0 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72   distinct = pPar
227c0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
227d0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
227e0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
227f0 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
22800 29 3b 0a 20 20 20 20 61 64 64 72 44 69 73 74 69  );.    addrDisti
22810 6e 63 74 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  nctIndex = sqlit
22820 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
22830 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
22840 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  , distinct, 0, 0
22850 2c 0a 20 20 20 20 20 20 20 20 28 63 68 61 72 2a  ,.        (char*
22860 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
22870 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
22880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
22890 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
228a0 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 7d  _UNORDERED);.  }
228b0 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e  else{.    distin
228c0 63 74 20 3d 20 61 64 64 72 44 69 73 74 69 6e 63  ct = addrDistinc
228d0 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
228e0 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65  ..  /* Aggregate
228f0 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61   and non-aggrega
22900 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20 68  te queries are h
22910 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
22920 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  ly */.  if( !isA
22930 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
22940 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
22950 74 20 2a 70 44 69 73 74 20 3d 20 28 69 73 44 69  t *pDist = (isDi
22960 73 74 69 6e 63 74 20 3f 20 70 2d 3e 70 45 4c 69  stinct ? p->pELi
22970 73 74 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  st : 0);..    /*
22980 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
22990 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  ase scan. */.   
229a0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
229b0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
229c0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
229d0 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c  here, &pOrderBy,
229e0 20 70 44 69 73 74 2c 20 30 29 3b 0a 20 20 20 20   pDist, 0);.    
229f0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
22a00 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
22a10 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
22a20 3e 6e 52 6f 77 4f 75 74 20 3c 20 70 2d 3e 6e 53  >nRowOut < p->nS
22a30 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
22a40 65 6c 65 63 74 52 6f 77 20 3d 20 70 57 49 6e 66  electRow = pWInf
22a50 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 20  o->nRowOut;..   
22a60 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69   /* If sorting i
22a70 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72  ndex that was cr
22a80 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  eated by a prior
22a90 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
22aa0 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  l .    ** instru
22ab0 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e  ction ended up n
22ac0 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c  ot being needed,
22ad0 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
22ae0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
22af0 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  l.    ** into an
22b00 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f   OP_Noop..    */
22b10 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f 72  .    if( addrSor
22b20 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72  tIndex>=0 && pOr
22b30 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
22b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
22b50 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
22b60 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a  rSortIndex, 1);.
22b70 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
22b80 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20  nEphm[2] = -1;. 
22b90 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 57     }..    if( pW
22ba0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
22bb0 29 7b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  ){.      VdbeOp 
22bc0 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
22bd0 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65       /* No longe
22be0 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45  r required OpenE
22bf0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20  phemeral instr. 
22c00 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 61  */.     .      a
22c10 73 73 65 72 74 28 20 61 64 64 72 44 69 73 74 69  ssert( addrDisti
22c20 6e 63 74 49 6e 64 65 78 3e 3d 30 20 29 3b 0a 20  nctIndex>=0 );. 
22c30 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
22c40 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61  e3VdbeGetOp(v, a
22c50 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64 65 78  ddrDistinctIndex
22c60 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
22c70 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 3b 0a  ( isDistinct );.
22c80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
22c90 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
22ca0 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
22cb0 4f 52 44 45 52 45 44 20 0a 20 20 20 20 20 20 20  ORDERED .       
22cc0 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65      || pWInfo->e
22cd0 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
22ce0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20  DISTINCT_UNIQUE 
22cf0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
22d00 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  distinct = -1;. 
22d10 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
22d20 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52  >eDistinct==WHER
22d30 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
22d40 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ED ){.        in
22d50 74 20 69 4a 75 6d 70 3b 0a 20 20 20 20 20 20 20  t iJump;.       
22d60 20 69 6e 74 20 69 45 78 70 72 3b 0a 20 20 20 20   int iExpr;.    
22d70 20 20 20 20 69 6e 74 20 69 46 6c 61 67 20 3d 20      int iFlag = 
22d80 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
22d90 20 20 20 20 20 20 20 20 69 6e 74 20 69 42 61 73          int iBas
22da0 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e = pParse->nMem
22db0 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +1;.        int 
22dc0 69 42 61 73 65 32 20 3d 20 69 42 61 73 65 20 2b  iBase2 = iBase +
22dd0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
22de0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
22df0 6e 4d 65 6d 20 2b 3d 20 28 70 45 4c 69 73 74 2d  nMem += (pEList-
22e00 3e 6e 45 78 70 72 2a 32 29 3b 0a 0a 20 20 20 20  >nExpr*2);..    
22e10 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
22e20 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
22e30 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  al coded earlier
22e40 20 74 6f 20 61 6e 20 4f 50 5f 49 6e 74 65 67 65   to an OP_Intege
22e50 72 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  r. The.        *
22e60 2a 20 4f 50 5f 49 6e 74 65 67 65 72 20 69 6e 69  * OP_Integer ini
22e70 74 69 61 6c 69 7a 65 73 20 74 68 65 20 22 66 69  tializes the "fi
22e80 72 73 74 20 72 6f 77 22 20 66 6c 61 67 2e 20 20  rst row" flag.  
22e90 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  */.        pOp->
22ea0 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 6e 74 65  opcode = OP_Inte
22eb0 67 65 72 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ger;.        pOp
22ec0 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->p1 = 1;.      
22ed0 20 20 70 4f 70 2d 3e 70 32 20 3d 20 69 46 6c 61    pOp->p2 = iFla
22ee0 67 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g;..        sqli
22ef0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
22f00 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
22f10 73 74 2c 20 69 42 61 73 65 2c 20 31 29 3b 0a 20  st, iBase, 1);. 
22f20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73         iJump = s
22f30 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
22f40 74 41 64 64 72 28 76 29 20 2b 20 31 20 2b 20 70  tAddr(v) + 1 + p
22f50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31  EList->nExpr + 1
22f60 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   + 1;.        sq
22f70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22f80 76 2c 20 4f 50 5f 49 66 2c 20 69 46 6c 61 67 2c  v, OP_If, iFlag,
22f90 20 69 4a 75 6d 70 2d 31 29 3b 0a 20 20 20 20 20   iJump-1);.     
22fa0 20 20 20 66 6f 72 28 69 45 78 70 72 3d 30 3b 20     for(iExpr=0; 
22fb0 69 45 78 70 72 3c 70 45 4c 69 73 74 2d 3e 6e 45  iExpr<pEList->nE
22fc0 78 70 72 3b 20 69 45 78 70 72 2b 2b 29 7b 0a 20  xpr; iExpr++){. 
22fd0 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
22fe0 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
22ff0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
23000 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
23010 45 78 70 72 5d 2e 70 45 78 70 72 29 3b 0a 20 20  Expr].pExpr);.  
23020 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23030 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
23040 4e 65 2c 20 69 42 61 73 65 2b 69 45 78 70 72 2c  Ne, iBase+iExpr,
23050 20 69 4a 75 6d 70 2c 20 69 42 61 73 65 32 2b 69   iJump, iBase2+i
23060 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
23070 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
23080 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
23090 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
230a0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
230b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
230c0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
230d0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
230e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
230f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23100 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
23110 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  , pWInfo->iConti
23120 6e 75 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 73  nue);..        s
23130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23140 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
23150 30 2c 20 69 46 6c 61 67 29 3b 0a 20 20 20 20 20  0, iFlag);.     
23160 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
23170 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
23180 72 28 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20  r(v)==iJump );. 
23190 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
231a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
231b0 6f 76 65 2c 20 69 42 61 73 65 2c 20 69 42 61 73  ove, iBase, iBas
231c0 65 32 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  e2, pEList->nExp
231d0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
231e0 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
231f0 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
23200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
23210 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74     /* Use the st
23220 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f  andard inner loo
23230 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74  p. */.    select
23240 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
23250 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  , p, pEList, 0, 
23260 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73  0, pOrderBy, dis
23270 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
23280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23290 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69    pWInfo->iConti
232a0 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  nue, pWInfo->iBr
232b0 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  eak);..    /* En
232c0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
232d0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
232e0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
232f0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
23300 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
23310 69 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73  is is the proces
23320 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
23330 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
23340 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
23350 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
23360 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
23370 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
23380 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
23390 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
233a0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
233b0 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
233c0 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
233d0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
233e0 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
233f0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
23400 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
23410 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
23420 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
23430 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
23440 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
23450 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
23460 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
23490 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
234a0 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
234b0 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234d0 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
234e0 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
234f0 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
23500 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
23510 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
23520 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
23530 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
23540 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
23550 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
23560 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
23570 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
23580 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a  drEnd;        /*
23590 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69   End of processi
235a0 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ng for this SELE
235b0 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  CT */.    int so
235c0 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a  rtPTab = 0;   /*
235d0 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65   Pseudotable use
235e0 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74  d to decode sort
235f0 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ing results */. 
23600 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d     int sortOut =
23610 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74   0;    /* Output
23620 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74   register from t
23630 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20  he sorter */..  
23640 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
23650 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20  and all aliases 
23660 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75  between the resu
23670 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20  lt set and the. 
23680 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63     ** GROUP BY c
23690 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
236a0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
236b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20  {.      int k;  
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
236e0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73  unter */.      s
236f0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
23700 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20  tem *pItem;  /* 
23710 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
23720 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
23730 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
23740 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d  for(k=p->pEList-
23750 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
23760 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b  >pEList->a; k>0;
23770 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
23780 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
23790 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
237a0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70   }.      for(k=p
237b0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
237c0 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
237d0 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
237e0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
237f0 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30  Item->iAlias = 0
23800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23810 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
23820 77 3e 28 64 6f 75 62 6c 65 29 31 30 30 20 29 20  w>(double)100 ) 
23830 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
23840 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a 20 20 20  (double)100;.   
23850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
23860 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64  >nSelectRow = (d
23870 6f 75 62 6c 65 29 31 3b 0a 20 20 20 20 7d 0a 0a  ouble)1;.    }..
23880 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
23890 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
238a0 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
238b0 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
238c0 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
238d0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
238e0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
238f0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
23900 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
23910 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
23920 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
23930 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
23940 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
23950 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
23960 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
23970 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
23980 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
23990 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
239a0 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
239b0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
239c0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
239d0 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
239e0 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
239f0 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
23a00 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
23a10 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
23a20 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
23a30 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
23a40 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
23a50 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
23a60 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
23a70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
23a80 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
23a90 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
23aa0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
23ab0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
23ac0 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
23ad0 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
23ae0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23af0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
23b00 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
23b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
23b20 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
23b30 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
23b40 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lumn;.    for(i=
23b50 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
23b60 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
23b70 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
23b80 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e  sProperty(sAggIn
23b90 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
23ba0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
23bb0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
23bc0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
23bd0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
23be0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
23bf0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
23c00 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
23c10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
23c20 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
23c30 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
23c40 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
23c50 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
23c60 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
23c70 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
23c80 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
23c90 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
23ca0 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
23cb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
23cc0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
23cd0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
23ce0 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
23cf0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
23d00 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
23d10 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
23d20 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
23d30 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
23d40 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
23d50 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
23d60 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
23d70 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
23d80 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
23d90 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
23da0 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
23db0 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
23dc0 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
23dd0 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
23de0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
23df0 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
23e00 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
23e10 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
23e20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
23e30 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
23e40 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
23e50 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
23e60 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
23e70 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
23e80 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
23e90 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
23ea0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
23eb0 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
23ec0 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
23ed0 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
23ee0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
23ef0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
23f00 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
23f10 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
23f20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
23f30 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
23f40 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
23f50 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
23f60 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
23f70 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
23f80 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
23f90 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
23fa0 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
23fb0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
23fc0 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
23fd0 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
23fe0 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
23ff0 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
24000 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
24010 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
24020 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
24030 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
24040 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
24050 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
24060 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
24070 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
24080 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
24090 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
240a0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
240b0 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  y);.      addrSo
240c0 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
240d0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
240e0 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a  OP_SorterOpen, .
240f0 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
24100 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
24110 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
24120 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
24130 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
24140 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
24150 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20  O_HANDOFF);..   
24160 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
24170 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
24180 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
24190 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
241a0 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
241b0 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
241c0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
241d0 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
241e0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
241f0 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
24200 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
24210 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
24220 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
24230 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
24240 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
24250 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
24260 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
24270 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
24280 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
24290 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
242a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
242b0 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
242c0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
242d0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
242e0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
242f0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
24300 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
24310 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
24320 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
24330 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24340 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
24350 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
24360 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
24370 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
24380 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
24390 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
243a0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
243b0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
243c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
243d0 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
243e0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
243f0 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
24400 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
24410 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
24420 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
24430 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
24440 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
24450 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
24460 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
24470 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
24480 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
24490 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
244a0 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
244b0 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
244c0 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
244d0 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
244e0 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
244f0 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
24500 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
24510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24520 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
24530 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
24540 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
24550 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
24560 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
24570 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
24580 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  , &pGroupBy, 0, 
24590 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  0);.      if( pW
245a0 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
245b0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
245c0 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30   if( pGroupBy==0
245d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
245e0 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
245f0 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
24600 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
24610 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
24620 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
24630 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
24640 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
24650 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
24660 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
24670 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
24680 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
24690 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
246a0 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
246b0 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42  .        pGroupB
246c0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
246d0 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
246e0 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
246f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
24700 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
24710 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
24720 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
24730 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
24740 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
24750 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
24760 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
24770 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
24780 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
24790 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
247a0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
247b0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
247c0 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
247d0 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
247e0 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
247f0 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
24800 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
24810 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
24820 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
24830 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
24840 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
24850 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
24860 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
24870 20 20 69 73 44 69 73 74 69 6e 63 74 20 26 26 20    isDistinct && 
24880 21 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  !(p->selFlags&SF
24890 5f 44 69 73 74 69 6e 63 74 29 3f 22 44 49 53 54  _Distinct)?"DIST
248a0 49 4e 43 54 22 3a 22 47 52 4f 55 50 20 42 59 22  INCT":"GROUP BY"
248b0 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
248c0 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
248d0 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
248e0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
248f0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
24900 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20  nGroupBy + 1;.  
24910 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
24920 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  By+1;.        fo
24930 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
24940 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
24950 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
24960 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
24970 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
24980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24990 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
249a0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
249b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
249c0 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
249d0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
249e0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
249f0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
24a00 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
24a10 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
24a20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
24a30 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
24a40 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
24a50 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Base, 0);.      
24a60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24a70 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
24a80 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ce, sAggInfo.sor
24a90 74 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b  tingIdx,regBase+
24aa0 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  nGroupBy);.     
24ab0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
24ac0 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
24ad0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
24ae0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
24af0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
24b00 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
24b10 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
24b20 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
24b30 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
24b40 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
24b50 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
24b60 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
24b70 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
24b80 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  r2;..           
24b90 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
24ba0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
24bb0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bd0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
24be0 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
24bf0 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
24c00 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
24c10 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
24c30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24c40 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
24c50 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
24c60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
24c70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
24c80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24c90 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
24ca0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
24cb0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
24cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24cd0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
24ce0 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
24cf0 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
24d00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24d10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24d20 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41  SorterInsert, sA
24d30 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
24d40 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
24d50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
24d60 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
24d70 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
24d80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24d90 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
24da0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
24db0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
24dc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
24dd0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
24de0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
24df0 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74  ngIdxPTab = sort
24e00 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  PTab = pParse->n
24e10 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
24e20 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ortOut = sqlite3
24e30 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
24e40 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
24e50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
24e60 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
24e70 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75  sortPTab, sortOu
24e80 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, nCol);.      
24e90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24ea0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
24eb0 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
24ec0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
24ed0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
24ee0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
24ef0 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a  OUP BY sort"));.
24f00 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
24f10 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
24f20 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
24f30 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
24f40 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
24f50 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61   }..      /* Eva
24f60 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  luate the curren
24f70 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
24f80 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30   and store in b0
24f90 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20  , b1, b2....    
24fa0 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f    ** (b0 is memo
24fb0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65  ry location iBMe
24fc0 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d  m+0, b1 is iBMem
24fd0 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  +1, and so forth
24fe0 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ).      ** Then 
24ff0 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72  compare the curr
25000 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
25010 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47  ms against the G
25020 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20  ROUP BY terms.  
25030 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
25040 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72  previous row cur
25050 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
25060 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20   a0, a1, a2.... 
25070 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
25080 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71  drTopOfLoop = sq
25090 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
250a0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
250b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
250c0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
250d0 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
250e0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
250f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25100 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
25110 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  a, sAggInfo.sort
25120 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29  ingIdx, sortOut)
25130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25140 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
25150 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
25160 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
25170 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
25180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25190 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
251a0 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c  olumn, sortPTab,
251b0 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20   j, iBMem+j);.  
251c0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
251d0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   ) sqlite3VdbeCh
251e0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
251f0 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20  _CLEARCACHE);.  
25200 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25210 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
25220 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
25230 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25240 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
25250 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d  , pGroupBy->a[j]
25260 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29  .pExpr, iBMem+j)
25270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25280 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
25290 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
252a0 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d  P_Compare, iAMem
252b0 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iBMem, pGroupB
252c0 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  y->nExpr,.      
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252e0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
252f0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
25300 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c  ;.      j1 = sql
25310 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
25320 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
25330 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
25340 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31  v, OP_Jump, j1+1
25350 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20  , 0, j1+1);..   
25360 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
25370 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
25380 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50  enever the GROUP
25390 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20   BY changes..   
253a0 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e     ** Changes in
253b0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72   the GROUP BY ar
253c0 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
253d0 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a  e previous code.
253e0 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20        ** block. 
253f0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
25400 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20  o changes, this 
25410 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64  block is skipped
25420 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
25430 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f   ** This code co
25440 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f  pies current gro
25450 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62  up by terms in b
25460 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20  0,b1,b2,....    
25470 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c    ** over to a0,
25480 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20  a1,a2.  It then 
25490 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74  calls the output
254a0 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
254b0 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20    ** and resets 
254c0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
254d0 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
254e0 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69  ers in preparati
254f0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  on.      ** for 
25500 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42  the next GROUP B
25510 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a  Y batch..      *
25520 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
25530 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
25540 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d  se, iBMem, iAMem
25550 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
25560 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
25570 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
25580 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70  P_Gosub, regOutp
25590 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75  utRow, addrOutpu
255a0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
255b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
255c0 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b  tput one row"));
255d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
255e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
255f0 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67  fPos, iAbortFlag
25600 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
25610 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
25620 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66  , "check abort f
25630 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
25640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25650 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
25660 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
25670 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
25680 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20  ment((v, "reset 
25690 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
256a0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
256b0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
256c0 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65  ccumulators base
256d0 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
256e0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
256f0 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20   current row.   
25700 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
25710 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
25720 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70  v, j1);.      up
25730 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
25740 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
25750 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
25760 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
25770 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55  P_Integer, 1, iU
25780 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
25790 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
257a0 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
257b0 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
257c0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
257d0 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
257e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
257f0 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
25800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25810 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
25820 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  terNext, sAggInf
25830 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
25840 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
25850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25860 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
25870 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
25880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
25890 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
258a0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31  ddrSortingIdx, 1
258b0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
258c0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
258d0 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
258e0 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
258f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25900 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
25910 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
25920 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
25930 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
25940 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
25950 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20  nal row"));..   
25960 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20     /* Jump over 
25970 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a  the subroutines.
25980 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
25990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
259a0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
259b0 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20  addrEnd);..     
259c0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
259d0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
259e0 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
259f0 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
25a00 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
25a10 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
25a20 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
25a30 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
25a40 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
25a50 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
25a60 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
25a70 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
25a80 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
25a90 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
25aa0 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
25ab0 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
25ac0 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
25ad0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
25ae0 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
25af0 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
25b00 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
25b10 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
25b20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
25b30 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
25b40 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
25b50 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
25b60 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
25b70 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
25b80 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
25b90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25ba0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
25bb0 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
25bc0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
25bd0 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c  v, "set abort fl
25be0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
25bf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
25c00 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
25c10 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
25c20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
25c30 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
25c40 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
25c50 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
25c60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
25c70 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
25c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25c90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
25ca0 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
25cb0 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
25cc0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
25cd0 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
25ce0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
25cf0 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
25d00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25d10 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
25d20 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
25d30 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  w);.      finali
25d40 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
25d50 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
25d60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25d70 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
25d80 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
25d90 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
25da0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
25db0 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
25dc0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
25dd0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
25de0 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20   0, pOrderBy,.  
25df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e00 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44      distinct, pD
25e10 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
25e20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
25e30 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
25e40 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20  SetAbort);.     
25e50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25e60 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
25e70 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
25e80 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
25e90 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
25ea0 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
25eb0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
25ec0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
25ed0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
25ee0 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
25ef0 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
25f00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
25f10 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
25f20 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52  veLabel(v, addrR
25f30 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73  eset);.      res
25f40 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
25f50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
25f60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25f70 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
25f80 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74  Return, regReset
25f90 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  );.     .    } /
25fa0 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
25fb0 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61  .  Begin aggrega
25fc0 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f  te queries witho
25fd0 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a  ut GROUP BY: */.
25fe0 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
25ff0 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20   ExprList *pDel 
26000 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
26010 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
26020 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20  UNT.      Table 
26030 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  *pTab;.      if(
26040 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c   (pTab = isSimpl
26050 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49  eCount(p, &sAggI
26060 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  nfo))!=0 ){.    
26070 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70      /* If isSimp
26080 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e  leCount() return
26090 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
260a0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
260b0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
260c0 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
260d0 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ent is of the fo
260e0 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  rm:.        **. 
260f0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
26100 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
26110 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a   <tbl>.        *
26120 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65  *.        ** whe
26130 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  re the Table str
26140 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
26150 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65  represents table
26160 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20   <tbl>..        
26170 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
26180 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
26190 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69  so common that i
261a0 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73  t is optimized s
261b0 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20  pecially. The.  
261c0 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e        ** OP_Coun
261d0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  t instruction is
261e0 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72   executed either
261f0 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74   on the intkey t
26200 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20  able that.      
26210 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
26220 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65  e data for table
26230 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65   <tbl> or on one
26240 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e   of its indexes.
26250 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   It.        ** i
26260 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63  s better to exec
26270 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e  ute the op on an
26280 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78   index, as index
26290 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20  es are almost.  
262a0 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
262b0 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65  spread across le
262c0 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68  ss pages than th
262d0 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  eir correspondin
262e0 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  g tables..      
262f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
26300 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  st int iDb = sql
26310 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
26320 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
26330 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
26340 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
26350 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iCsr = pParse->n
26360 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75  Tab++;     /* Cu
26370 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74  rsor to scan b-t
26380 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  ree */.        I
26390 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263b0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
263c0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
263d0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
263e0 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
263f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69           /* Keyi
26400 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20  nfo for scanned 
26410 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
26420 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20   Index *pBest = 
26430 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
26440 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e        /* Best in
26450 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72  dex found so far
26460 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
26470 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e  iRoot = pTab->tn
26480 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
26490 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
264a0 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20   scanned b-tree 
264b0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  */..        sqli
264c0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
264d0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
264e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
264f0 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
26500 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
26510 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
26520 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  me);..        /*
26530 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
26540 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74  index that has t
26550 68 65 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20  he least amount 
26560 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20  of columns. If. 
26570 20 20 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20         ** there 
26580 69 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  is such an index
26590 2c 20 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73  , and it has les
265a0 73 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74  s columns than t
265b0 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20  he table.       
265c0 20 2a 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77   ** does, then w
265d0 65 20 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61  e can assume tha
265e0 74 20 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65  t it consumes le
265f0 73 73 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b  ss space on disk
26600 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
26610 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62  will therefore b
26620 65 20 63 68 65 61 70 65 72 20 74 6f 20 73 63 61  e cheaper to sca
26630 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  n to determine t
26640 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e  he query result.
26650 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  .        ** In t
26660 68 69 73 20 63 61 73 65 20 73 65 74 20 69 52 6f  his case set iRo
26670 6f 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  ot to the root p
26680 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
26690 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20  e index b-tree. 
266a0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b         ** and pK
266b0 65 79 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65  eyInfo to the Ke
266c0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
266d0 72 65 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69  required to navi
266e0 67 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 20  gate the.       
266f0 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20   ** index..     
26700 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26710 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f   (2011-04-15) Do
26720 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73   not do a full s
26730 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65  can of an unorde
26740 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  red index..     
26750 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26760 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65   In practice the
26770 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
26780 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  re will not be u
26790 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  sed. It is only 
267a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73  .        ** pass
267b0 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70  ed to keep OP_Op
267c0 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20  enRead happy..  
267d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
267e0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
267f0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
26800 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
26810 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
26820 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  Idx->bUnordered=
26830 3d 30 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c  =0 && (!pBest ||
26840 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70   pIdx->nColumn<p
26850 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  Best->nColumn) )
26860 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  {.            pB
26870 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  est = pIdx;.    
26880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26890 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  }.        if( pB
268a0 65 73 74 20 26 26 20 70 42 65 73 74 2d 3e 6e 43  est && pBest->nC
268b0 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c  olumn<pTab->nCol
268c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52   ){.          iR
268d0 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75  oot = pBest->tnu
268e0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  m;.          pKe
268f0 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49  yInfo = sqlite3I
26900 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
26910 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  se, pBest);.    
26920 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
26930 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
26940 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75  ly cursor, execu
26950 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c  te the OP_Count,
26960 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f   close the curso
26970 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  r. */.        sq
26980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
26990 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
269a0 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62  iCsr, iRoot, iDb
269b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
269c0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
269d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
269e0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
269f0 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f  (char *)pKeyInfo
26a00 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
26a10 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20 7d  DOFF);.        }
26a20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26a30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26a40 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41  _Count, iCsr, sA
26a50 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e  ggInfo.aFunc[0].
26a60 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
26a70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
26a80 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43  (v, OP_Close, iC
26a90 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  sr);.        exp
26aa0 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
26ab0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42  pParse, pTab, pB
26ac0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
26ad0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
26ae0 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
26af0 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20  NT */.      {.  
26b00 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69        /* Check i
26b10 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f  f the query is o
26b20 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  f one of the fol
26b30 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20  lowing forms:.  
26b40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26b50 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e   **   SELECT min
26b60 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
26b70 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
26b80 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   max(x) FROM ...
26b90 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
26ba0 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
26bb0 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f   then ask the co
26bc0 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f  de in where.c to
26bd0 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74   attempt to sort
26be0 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20   results.       
26bf0 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20   ** as if there 
26c00 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e  was an "ORDER ON
26c10 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e   x" or "ORDER ON
26c20 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e   x DESC" clause.
26c30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20   .        ** If 
26c40 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20  where.c is able 
26c50 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c  to produce resul
26c60 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69  ts sorted in thi
26c70 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  s order, then.  
26c80 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62        ** add vdb
26c90 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20  e code to break 
26ca0 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65  out of the proce
26cb0 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72  ssing loop after
26cc0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
26cd0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
26ce0 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73   (since the firs
26cf0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
26d00 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20  he loop is .    
26d10 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65      ** guarantee
26d20 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  d to operate on 
26d30 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65  the row with the
26d40 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69   minimum or maxi
26d50 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  mum .        ** 
26d60 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20  value of x, the 
26d70 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65  only row require
26d80 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  d)..        **. 
26d90 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63         ** A spec
26da0 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65  ial flag must be
26db0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
26dc0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 74  e3WhereBegin() t
26dd0 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20  o slightly.     
26de0 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68     ** modify beh
26df0 61 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77  aviour as follow
26e00 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
26e10 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
26e20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
26e30 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
26e40 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
26e50 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ded by.        *
26e60 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
26e70 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
26e80 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
26e90 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
26ea0 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ue.        **   
26eb0 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20    for x..       
26ec0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
26ed0 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72   + The optimizer
26ee0 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
26ef0 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74   (the thing that
26f00 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20   decides which. 
26f10 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
26f20 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74  dex or indices t
26f30 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c  o use) should pl
26f40 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ace a different 
26f50 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20  priority on .   
26f60 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
26f70 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
26f80 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
26f90 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
26fa0 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
26fb0 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
26fc0 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
26fd0 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
26fe0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
26ff0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45      */.        E
27000 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
27010 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
27020 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75   flag = minMaxQu
27030 65 72 79 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ery(p);.        
27040 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
27050 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
27060 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
27070 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
27080 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
27090 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ct) );.         
270a0 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74   pMinMax = sqlit
270b0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
270c0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  , p->pEList->a[0
270d0 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ].pExpr->x.pList
270e0 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ,0);.          p
270f0 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20  Del = pMinMax;. 
27100 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69           if( pMi
27110 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c  nMax && !db->mal
27120 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
27130 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
27140 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
27150 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f   = flag!=WHERE_O
27160 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b  RDERBY_MIN ?1:0;
27170 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
27180 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  nMax->a[0].pExpr
27190 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
271a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
271b0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
271c0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
271d0 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
271e0 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
271f0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
27200 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
27210 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
27220 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
27230 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
27240 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
27250 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
27260 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27270 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
27280 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
27290 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
272a0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
272b0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
272c0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
272d0 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 30  ere, &pMinMax, 0
272e0 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20 20  , flag);.       
272f0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
27300 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
27310 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
27320 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
27330 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
27340 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
27350 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65  }.        update
27360 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
27370 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
27380 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4d 69          if( !pMi
27390 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a  nMax && flag ){.
273a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
273b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
273c0 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66  P_Goto, 0, pWInf
273d0 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  o->iBreak);.    
273e0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
273f0 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
27400 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20  ndex",.         
27410 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48         (flag==WH
27420 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f  ERE_ORDERBY_MIN?
27430 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a  "min":"max")));.
27440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27450 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
27460 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
27470 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
27480 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
27490 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
274a0 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64 65    }..      pOrde
274b0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
274c0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
274d0 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
274e0 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49  g, addrEnd, SQLI
274f0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
27500 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
27510 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
27520 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
27530 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  , 0, -1, .      
27540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27550 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
27560 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
27570 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
27580 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
27590 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
275a0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
275b0 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
275c0 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
275d0 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
275e0 79 20 2a 2f 0a 0a 20 20 69 66 28 20 64 69 73 74  y */..  if( dist
275f0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 65  inct>=0 ){.    e
27600 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
27610 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
27620 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  T");.  }..  /* I
27630 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
27640 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
27650 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
27660 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
27670 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
27680 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
27690 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
276a0 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
276b0 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  By ){.    explai
276c0 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
276d0 65 2c 20 22 4f 52 44 45 52 20 42 59 22 29 3b 0a  e, "ORDER BY");.
276e0 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
276f0 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
27700 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
27710 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
27720 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
27730 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
27740 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
27750 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
27760 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
27770 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
27780 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
27790 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
277a0 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
277b0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
277c0 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
277d0 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
277e0 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
277f0 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
27800 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
27810 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
27820 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
27830 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
27840 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
27850 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53  _end:.  explainS
27860 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
27870 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
27880 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
27890 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
278a0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72  olumn names if r
278b0 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45  esults of the SE
278c0 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f  LECT are to be o
278d0 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  utput..  */.  if
278e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
278f0 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  && pDest->eDest=
27900 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
27910 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
27920 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
27930 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
27940 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
27950 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
27960 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
27970 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
27980 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a  AggInfo.aFunc);.
27990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
279a0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
279b0 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a  TE_DEBUG)./*.***
279c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
279d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
279e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
279f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
27a10 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
27a20 64 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  de is used for t
27a30 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
27a40 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 20  ging only.  The 
27a50 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f 6c  code.** that fol
27a60 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 70  lows does not ap
27a70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20 62  pear in normal b
27a80 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uilds..**.** The
27a90 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
27aa0 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f 75  used to print ou
27ab0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
27ac0 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66 20   all or part of 
27ad0 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72 75  a .** parse stru
27ae0 63 74 75 72 65 73 20 73 75 63 68 20 61 73 20 53  ctures such as S
27af0 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20 20  elect or Expr.  
27b00 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20 61  Such printouts a
27b10 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  re useful.** for
27b20 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64 65   helping to unde
27b30 72 73 74 61 6e 64 20 77 68 61 74 20 69 73 20 68  rstand what is h
27b40 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65 20  appening inside 
27b50 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
27b60 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 65  or.** during the
27b70 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 6f   execution of co
27b80 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74 61  mplex SELECT sta
27b90 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  tements..**.** T
27ba0 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72 65  hese routine are
27bb0 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79 77   not called anyw
27bc0 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  here from within
27bd0 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63   the normal.** c
27be0 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e 20  ode base.  Then 
27bf0 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  are intended to 
27c00 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
27c10 69 74 68 69 6e 20 74 68 65 20 64 65 62 75 67 67  ithin the debugg
27c20 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74 65  er.** or from te
27c30 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66 22  mporary "printf"
27c40 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 65   statements inse
27c50 72 74 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  rted for debuggi
27c60 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ng..*/.void sqli
27c70 74 65 33 50 72 69 6e 74 45 78 70 72 28 45 78 70  te3PrintExpr(Exp
27c80 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 45 78  r *p){.  if( !Ex
27c90 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
27ca0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
27cb0 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
27cc0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
27cd0 50 72 69 6e 74 66 28 22 28 25 73 22 2c 20 70 2d  Printf("(%s", p-
27ce0 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d 65  >u.zToken);.  }e
27cf0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
27d00 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 64  DebugPrintf("(%d
27d10 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20  ", p->op);.  }. 
27d20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b   if( p->pLeft ){
27d30 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
27d40 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20  gPrintf(" ");.  
27d50 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
27d60 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pr(p->pLeft);.  
27d70 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  }.  if( p->pRigh
27d80 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
27d90 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29  DebugPrintf(" ")
27da0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
27db0 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  ntExpr(p->pRight
27dc0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
27dd0 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 22 29  DebugPrintf(")")
27de0 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
27df0 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78  PrintExprList(Ex
27e00 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
27e10 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
27e20 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
27e30 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  pr; i++){.    sq
27e40 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
27e50 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
27e60 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69  );.    if( i<pLi
27e70 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  st->nExpr-1 ){. 
27e80 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
27e90 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20  gPrintf(", ");. 
27ea0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20     }.  }.}.void 
27eb0 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65  sqlite3PrintSele
27ec0 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
27ed0 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c  t indent){.  sql
27ee0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
27ef0 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22  "%*sSELECT(%p) "
27f00 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29  , indent, "", p)
27f10 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74  ;.  sqlite3Print
27f20 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
27f30 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
27f40 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
27f50 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29  .  if( p->pSrc )
27f60 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65  {.    char *zPre
27f70 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  fix;.    int i;.
27f80 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46      zPrefix = "F
27f90 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ROM";.    for(i=
27fa0 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
27fb0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
27fc0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
27fd0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
27fe0 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
27ff0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
28000 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e  rintf("%*s ", in
28010 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29  dent+6, zPrefix)
28020 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78 20  ;.      zPrefix 
28030 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20  = "";.      if( 
28040 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
28050 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28060 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c  3DebugPrintf("(\
28070 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n");.        sql
28080 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
28090 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
280a0 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20  indent+10);.    
280b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
280c0 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69  Printf("%*s)", i
280d0 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20  ndent+8, "");.  
280e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
280f0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
28100 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
28110 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70  ugPrintf("%s", p
28120 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
28130 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28140 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20  pItem->pTab ){. 
28150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
28160 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c  bugPrintf("(tabl
28170 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  e: %s)", pItem->
28180 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
28190 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
281a0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
281b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
281c0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41 53  DebugPrintf(" AS
281d0 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c   %s", pItem->zAl
281e0 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
281f0 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72      if( i<p->pSr
28200 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20  c->nSrc-1 ){.   
28210 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
28220 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20  gPrintf(",");.  
28230 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
28240 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
28250 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
28260 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
28270 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
28280 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57  bugPrintf("%*s W
28290 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20  HERE ", indent, 
282a0 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
282b0 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68  PrintExpr(p->pWh
282c0 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
282d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
282e0 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
282f0 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
28300 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
28310 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42  ntf("%*s GROUP B
28320 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  Y ", indent, "")
28330 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
28340 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  ntExprList(p->pG
28350 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
28360 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
28370 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
28380 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20   p->pHaving ){. 
28390 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
283a0 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e  rintf("%*s HAVIN
283b0 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  G ", indent, "")
283c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
283d0 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  ntExpr(p->pHavin
283e0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
283f0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
28400 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
28410 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
28420 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
28430 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20  f("%*s ORDER BY 
28440 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
28450 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
28460 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
28470 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  erBy);.    sqlit
28480 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
28490 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e  n");.  }.}./* En
284a0 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  d of the structu
284b0 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e  re debug printin
284c0 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g code.*********
284d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
284f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28510 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
28520 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
28530 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
28540 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f  SQLITE_DEBUG) */
28550 0a                                               .