/ Hex Artifact Content
Login

Artifact 97b75b400070829833dfdebbd8a8575321d2f444:


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 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70   || pItem->isPop
21020 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75  ulated ) continu
21030 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65  e;..    /* Incre
21040 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
21050 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
21060 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
21070 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
21080 2a 20 74 72 65 65 20 72 65 66 65 72 65 64 20 74  * tree refered t
21090 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
210a0 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
210b0 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
210c0 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
210d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
210e0 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
210f0 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
21100 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
21110 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
21120 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
21130 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
21140 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
21150 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
21160 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
21170 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
21180 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
21190 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
211a0 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
211b0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
211c0 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f  eight(p);..    /
211d0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
211e0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  f the subquery c
211f0 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69  an be absorbed i
21200 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20  nto the parent. 
21210 2a 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  */.    isAggSub 
21220 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
21230 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
21240 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
21250 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
21260 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
21270 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
21280 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53        if( isAggS
21290 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ub ){.        is
212a0 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Agg = 1;.       
212b0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
212c0 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
212d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
212e0 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
212f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
21300 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
21310 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
21320 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
21330 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21340 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
21350 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  d==0 );.      ex
21360 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
21370 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
21380 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e  , (u8)pParse->iN
21390 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
213a0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
213b0 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
213c0 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
213d0 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
213e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
213f0 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  m->pTab->nRowEst
21400 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 53 75   = (unsigned)pSu
21410 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
21420 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70     }.    if( /*p
21430 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f  Parse->nErr ||*/
21440 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
21450 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  d ){.      goto 
21460 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
21470 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  }.    pParse->nH
21480 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33  eight -= sqlite3
21490 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
214a0 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  (p);.    pTabLis
214b0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
214c0 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
214d0 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
214e0 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
214f0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
21500 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73     }.  }.  pELis
21510 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23  t = p->pEList;.#
21520 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d  endif.  pWhere =
21530 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47   p->pWhere;.  pG
21540 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
21550 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
21560 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
21570 69 73 44 69 73 74 69 6e 63 74 20 3d 20 28 70 2d  isDistinct = (p-
21580 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
21590 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69  istinct)!=0;..#i
215a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
215b0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
215c0 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  T.  /* If there 
215d0 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63  is are a sequenc
215e0 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f  e of queries, do
215f0 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65   the earlier one
21600 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  s first..  */.  
21610 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
21620 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67  .    if( p->pRig
21630 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20  htmost==0 ){.   
21640 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
21650 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  , *pRight = 0;. 
21660 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30       int cnt = 0
21670 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65  ;.      int mxSe
21680 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  lect;.      for(
21690 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
216a0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
216b0 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20  ior, cnt++){.   
216c0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67       pLoop->pRig
216d0 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20  htmost = p;.    
216e0 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74      pLoop->pNext
216f0 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
21700 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f     pRight = pLoo
21710 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
21720 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e   mxSelect = db->
21730 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
21740 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
21750 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ECT];.      if( 
21760 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e  mxSelect && cnt>
21770 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  mxSelect ){.    
21780 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
21790 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
217a0 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63   many terms in c
217b0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29  ompound SELECT")
217c0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
217d0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
217e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20   }.    }.    rc 
217f0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  = multiSelect(pP
21800 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
21810 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49  .    explainSetI
21820 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
21830 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
21840 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  reSelectId);.   
21850 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
21860 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
21870 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20  there is both a 
21880 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20  GROUP BY and an 
21890 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
218a0 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 2a  and they are.  *
218b0 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
218c0 6e 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52  n disable the OR
218d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 69  DER BY clause si
218e0 6e 63 65 20 74 68 65 20 47 52 4f 55 50 20 42 59  nce the GROUP BY
218f0 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65  .  ** will cause
21900 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d   elements to com
21910 65 20 6f 75 74 20 69 6e 20 74 68 65 20 63 6f 72  e out in the cor
21920 72 65 63 74 20 6f 72 64 65 72 2e 20 20 54 68 69  rect order.  Thi
21930 73 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74  s is.  ** an opt
21940 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20  imization - the 
21950 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73  correct answer s
21960 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67  hould result reg
21970 61 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73  ardless..  ** Us
21980 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f  e the SQLITE_Gro
21990 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77  upByOrder flag w
219a0 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ith SQLITE_TESTC
219b0 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20  TRL_OPTIMIZER.  
219c0 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ** to disable th
219d0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
219e0 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
219f0 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oses..  */.  if(
21a00 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
21a10 43 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f 75  Compare(p->pGrou
21a20 70 42 79 2c 20 70 4f 72 64 65 72 42 79 29 3d 3d  pBy, pOrderBy)==
21a30 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 64  0.         && (d
21a40 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
21a50 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 3d  E_GroupByOrder)=
21a60 3d 30 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  =0 ){.    pOrder
21a70 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
21a80 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
21a90 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20  s DISTINCT with 
21aa0 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20  an ORDER BY but 
21ab0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
21ac0 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69  ate, and .  ** i
21ad0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73  f the select-lis
21ae0 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
21af0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69   the ORDER BY li
21b00 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75  st, then this qu
21b10 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ery.  ** can be 
21b20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47  rewritten as a G
21b30 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65  ROUP BY. In othe
21b40 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20  r words, this:. 
21b50 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
21b60 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a  ECT DISTINCT xyz
21b70 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20   FROM ... ORDER 
21b80 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
21b90 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
21ba0 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
21bb0 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f    SELECT xyz FRO
21bc0 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78  M ... GROUP BY x
21bd0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  yz.  **.  ** The
21be0 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20   second form is 
21bf0 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73  preferred as a s
21c00 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20  ingle index (or 
21c10 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20  temp-table) may 
21c20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f  be .  ** used fo
21c30 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52  r both the ORDER
21c40 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
21c50 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20   processing. As 
21c60 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a  originally .  **
21c70 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65   written the que
21c80 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65  ry must use a te
21c90 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20  mp-table for at 
21ca0 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
21cb0 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20   ORDER .  ** BY 
21cc0 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e  and DISTINCT, an
21cd0 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65  d an index or se
21ce0 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c  parate temp-tabl
21cf0 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e  e for the other.
21d00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
21d10 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
21d20 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
21d30 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
21d40 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74  nct .   && sqlit
21d50 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
21d60 65 28 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70  e(pOrderBy, p->p
21d70 45 4c 69 73 74 29 3d 3d 30 0a 20 20 29 7b 0a 20  EList)==0.  ){. 
21d80 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
21d90 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
21da0 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
21db0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
21dc0 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
21dd0 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f  st, 0);.    pGro
21de0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
21df0 42 79 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  By;.    pOrderBy
21e00 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
21e10 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
21e20 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
21e30 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e  then this sortin
21e40 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67  g.  ** index mig
21e50 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
21e60 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
21e70 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20  ta can be .  ** 
21e80 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
21e90 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20  -sorted order.  
21ea0 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
21eb0 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ase, then the.  
21ec0 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  ** OP_OpenEpheme
21ed0 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
21ee0 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
21ef0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
21f00 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72  ce.  ** we figur
21f10 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
21f20 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  orting index is 
21f30 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
21f40 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20   addrSortIndex. 
21f50 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
21f60 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
21f70 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  te that change..
21f80 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
21f90 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
21fa0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
21fb0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
21fc0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
21fd0 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
21fe0 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  y);.    pOrderBy
21ff0 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  ->iECursor = pPa
22000 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
22010 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
22020 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e  [2] = addrSortIn
22030 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
22040 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
22050 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
22060 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
22080 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
22090 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
220a0 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  r+2, 0,.        
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220c0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
220d0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
220e0 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65  ANDOFF);.  }else
220f0 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e  {.    addrSortIn
22100 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
22110 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
22120 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
22130 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
22140 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
22150 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
22160 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
22170 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
22180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22190 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
221a0 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
221b0 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  >iParm, pEList->
221c0 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
221d0 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
221e0 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
221f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
22200 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e  Label(v);.  p->n
22210 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75  SelectRow = (dou
22220 62 6c 65 29 4c 41 52 47 45 53 54 5f 49 4e 54 36  ble)LARGEST_INT6
22230 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  4;.  computeLimi
22240 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
22250 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69  e, p, iEnd);.  i
22260 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  f( p->iLimit==0 
22270 26 26 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  && addrSortIndex
22280 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
22290 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61  e3VdbeGetOp(v, a
222a0 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f  ddrSortIndex)->o
222b0 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65  pcode = OP_Sorte
222c0 72 4f 70 65 6e 3b 0a 20 20 20 20 70 2d 3e 73 65  rOpen;.    p->se
222d0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
222e0 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  Sorter;.  }..  /
222f0 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c  * Open a virtual
22300 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
22310 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
22320 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
22330 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22340 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
22350 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
22360 6f 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  o;.    distinct 
22370 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
22380 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
22390 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
223a0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
223b0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 61 64 64  pEList);.    add
223c0 72 44 69 73 74 69 6e 63 74 49 6e 64 65 78 20 3d  rDistinctIndex =
223d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
223e0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
223f0 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74  emeral, distinct
22400 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
22410 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
22420 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
22430 4f 46 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OFF);.    sqlite
22440 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
22450 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
22460 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22470 64 69 73 74 69 6e 63 74 20 3d 20 61 64 64 72 44  distinct = addrD
22480 69 73 74 69 6e 63 74 49 6e 64 65 78 20 3d 20 2d  istinctIndex = -
22490 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67  1;.  }..  /* Agg
224a0 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61  regate and non-a
224b0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
224c0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66   are handled dif
224d0 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66  ferently */.  if
224e0 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
224f0 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 45  upBy==0 ){.    E
22500 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 20 3d  xprList *pDist =
22510 20 28 69 73 44 69 73 74 69 6e 63 74 20 3f 20 70   (isDistinct ? p
22520 2d 3e 70 45 4c 69 73 74 20 3a 20 30 29 3b 0a 0a  ->pEList : 0);..
22530 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65      /* Begin the
22540 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20   database scan. 
22550 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
22560 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
22570 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
22580 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72  st, pWhere, &pOr
22590 64 65 72 42 79 2c 20 70 44 69 73 74 2c 20 30 29  derBy, pDist, 0)
225a0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
225b0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
225c0 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  t_end;.    if( p
225d0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3c  WInfo->nRowOut <
225e0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29   p->nSelectRow )
225f0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
22600 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
22610 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  ;..    /* If sor
22620 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
22630 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
22640 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
22650 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
22660 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
22670 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
22680 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
22690 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
226a0 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
226b0 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
226c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61      */.    if( a
226d0 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
226e0 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  && pOrderBy==0 )
226f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
22700 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
22710 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  v, addrSortIndex
22720 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  , 1);.      p->a
22730 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
22740 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
22750 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  if( pWInfo->eDis
22760 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 56  tinct ){.      V
22770 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
22780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
22790 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
227a0 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
227b0 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 0a 20  nstr. */.     . 
227c0 20 20 20 20 20 61 73 73 65 72 74 28 20 61 64 64       assert( add
227d0 72 44 69 73 74 69 6e 63 74 49 6e 64 65 78 3e 3d  rDistinctIndex>=
227e0 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  0 );.      pOp =
227f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
22800 70 28 76 2c 20 61 64 64 72 44 69 73 74 69 6e 63  p(v, addrDistinc
22810 74 49 6e 64 65 78 29 3b 0a 0a 20 20 20 20 20 20  tIndex);..      
22820 61 73 73 65 72 74 28 20 69 73 44 69 73 74 69 6e  assert( isDistin
22830 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ct );.      asse
22840 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  rt( pWInfo->eDis
22850 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53  tinct==WHERE_DIS
22860 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 20 0a 20  TINCT_ORDERED . 
22870 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 49            || pWI
22880 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
22890 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
228a0 4e 49 51 55 45 20 0a 20 20 20 20 20 20 29 3b 0a  NIQUE .      );.
228b0 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d        distinct =
228c0 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
228d0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
228e0 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
228f0 5f 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20  _ORDERED ){.    
22900 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 0a 20      int iJump;. 
22910 20 20 20 20 20 20 20 69 6e 74 20 69 45 78 70 72         int iExpr
22920 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 46  ;.        int iF
22930 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
22940 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  nMem;.        in
22950 74 20 69 42 61 73 65 20 3d 20 70 50 61 72 73 65  t iBase = pParse
22960 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
22970 20 20 69 6e 74 20 69 42 61 73 65 32 20 3d 20 69    int iBase2 = i
22980 42 61 73 65 20 2b 20 70 45 4c 69 73 74 2d 3e 6e  Base + pEList->n
22990 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50  Expr;.        pP
229a0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 28 70  arse->nMem += (p
229b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32 29 3b  EList->nExpr*2);
229c0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ..        /* Cha
229d0 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
229e0 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65  phemeral coded e
229f0 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f  arlier to an OP_
22a00 49 6e 74 65 67 65 72 2e 20 54 68 65 0a 20 20 20  Integer. The.   
22a10 20 20 20 20 20 2a 2a 20 4f 50 5f 49 6e 74 65 67       ** OP_Integ
22a20 65 72 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  er initializes t
22a30 68 65 20 22 66 69 72 73 74 20 72 6f 77 22 20 66  he "first row" f
22a40 6c 61 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  lag.  */.       
22a50 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
22a60 50 5f 49 6e 74 65 67 65 72 3b 0a 20 20 20 20 20  P_Integer;.     
22a70 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a     pOp->p1 = 1;.
22a80 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
22a90 3d 20 69 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20  = iFlag;..      
22aa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
22ab0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
22ac0 2c 20 70 45 4c 69 73 74 2c 20 69 42 61 73 65 2c  , pEList, iBase,
22ad0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 4a 75   1);.        iJu
22ae0 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
22af0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
22b00 20 31 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78   1 + pEList->nEx
22b10 70 72 20 2b 20 31 20 2b 20 31 3b 0a 20 20 20 20  pr + 1 + 1;.    
22b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22b30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
22b40 69 46 6c 61 67 2c 20 69 4a 75 6d 70 2d 31 29 3b  iFlag, iJump-1);
22b50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 45 78  .        for(iEx
22b60 70 72 3d 30 3b 20 69 45 78 70 72 3c 70 45 4c 69  pr=0; iExpr<pELi
22b70 73 74 2d 3e 6e 45 78 70 72 3b 20 69 45 78 70 72  st->nExpr; iExpr
22b80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ++){.          C
22b90 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
22ba0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
22bb0 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  eq(pParse, pELis
22bc0 74 2d 3e 61 5b 69 45 78 70 72 5d 2e 70 45 78 70  t->a[iExpr].pExp
22bd0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
22be0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
22bf0 76 2c 20 4f 50 5f 4e 65 2c 20 69 42 61 73 65 2b  v, OP_Ne, iBase+
22c00 69 45 78 70 72 2c 20 69 4a 75 6d 70 2c 20 69 42  iExpr, iJump, iB
22c10 61 73 65 32 2b 69 45 78 70 72 29 3b 0a 20 20 20  ase2+iExpr);.   
22c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22c30 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
22c40 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
22c50 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
22c60 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
22c70 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
22c80 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
22c90 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EQ);.        }. 
22ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22cb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
22cc0 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e  oto, 0, pWInfo->
22cd0 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 20  iContinue);..   
22ce0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22cf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
22d00 65 67 65 72 2c 20 30 2c 20 69 46 6c 61 67 29 3b  eger, 0, iFlag);
22d10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
22d20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
22d30 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
22d40 70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  p );.        sql
22d50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
22d60 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 42 61 73 65  , OP_Move, iBase
22d70 2c 20 69 42 61 73 65 32 2c 20 70 45 4c 69 73 74  , iBase2, pEList
22d80 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
22d90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
22da0 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
22db0 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Noop;.      }.  
22dc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20    }..    /* Use 
22dd0 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
22de0 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20  er loop. */.    
22df0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
22e00 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
22e10 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
22e20 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65  y, distinct, pDe
22e30 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
22e40 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
22e50 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66  iContinue, pWInf
22e60 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20  o->iBreak);..   
22e70 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
22e80 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
22e90 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
22ea0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
22eb0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
22ec0 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
22ed0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  processing for a
22ee0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
22ef0 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
22f00 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
22f10 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
22f20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
22f30 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
22f40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
22f50 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
22f60 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
22f70 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
22f80 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
22f90 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
22fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
22fb0 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
22fc0 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
22fd0 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
22fe0 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
22ff0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
23000 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
23010 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
23020 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
23030 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
23040 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
23050 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
23060 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23080 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
23090 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
230a0 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
230b0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
230c0 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
230d0 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
230e0 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
230f0 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
23100 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
23110 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
23120 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
23130 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
23140 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
23150 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
23160 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
23170 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
23180 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
23190 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
231a0 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
231b0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
231c0 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
231d0 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
231e0 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
231f0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  */..    /* Remov
23200 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c  e any and all al
23210 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68  iases between th
23220 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
23230 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55   the.    ** GROU
23240 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  P BY clause..   
23250 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
23260 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
23270 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t k;            
23280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23290 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
232a0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
232b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
232c0 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
232d0 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f  g over expressio
232e0 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a  n in a list */..
232f0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70        for(k=p->p
23300 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  EList->nExpr, pI
23310 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  tem=p->pEList->a
23320 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
23330 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
23340 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b  tem->iAlias = 0;
23350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
23360 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
23370 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
23380 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
23390 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
233a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69       pItem->iAli
233b0 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
233c0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
233d0 6c 65 63 74 52 6f 77 3e 28 64 6f 75 62 6c 65 29  lectRow>(double)
233e0 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  100 ) p->nSelect
233f0 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 31 30  Row = (double)10
23400 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
23410 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
23420 77 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  w = (double)1;. 
23430 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43     }.. .    /* C
23440 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
23450 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
23460 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
23470 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
23480 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
23490 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
234a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
234b0 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
234c0 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
234d0 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
234e0 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
234f0 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
23500 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
23510 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
23520 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
23530 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
23540 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
23550 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
23560 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
23570 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
23580 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
23590 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
235a0 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41  List;.    sNC.pA
235b0 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e  ggInfo = &sAggIn
235c0 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  fo;.    sAggInfo
235d0 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20  .nSortingColumn 
235e0 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72  = pGroupBy ? pGr
235f0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a  oupBy->nExpr+1 :
23600 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
23610 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
23620 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
23630 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
23640 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
23650 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
23660 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
23670 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29  (&sNC, pOrderBy)
23680 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
23690 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
236a0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
236b0 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
236c0 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
236d0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
236e0 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
236f0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
23700 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
23710 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
23720 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
23730 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23740 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
23750 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
23760 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
23770 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
23780 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
23790 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
237a0 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ].pExpr->x.pList
237b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
237c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
237d0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
237e0 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
237f0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
23800 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
23810 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
23820 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
23830 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
23840 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
23850 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
23860 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
23870 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
23880 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
23890 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
238a0 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
238b0 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
238c0 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
238d0 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20      int j1;     
238e0 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
238f0 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
23900 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
23910 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
23920 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
23930 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
23940 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
23950 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
23960 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
23970 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
23980 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
23990 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
239a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
239b0 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
239c0 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
239d0 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
239e0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
239f0 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
23a00 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
23a10 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
23a20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
23a30 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
23a40 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
23a50 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
23a60 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
23a70 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
23a80 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
23a90 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
23aa0 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
23ab0 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
23ac0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
23ad0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
23ae0 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
23af0 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
23b00 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
23b10 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
23b20 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
23b30 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
23b40 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
23b50 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
23b60 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
23b70 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
23b80 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
23b90 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
23ba0 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
23bb0 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
23bc0 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
23bd0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
23be0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
23bf0 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
23c00 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
23c10 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
23c20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
23c30 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
23c40 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
23c50 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
23c60 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
23c70 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d  addrSortingIdx =
23c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23c90 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  p4(v, OP_SorterO
23ca0 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pen, .          
23cb0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
23cc0 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53  Idx, sAggInfo.nS
23cd0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20  ortingColumn, . 
23ce0 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61           0, (cha
23cf0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
23d00 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
23d10 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
23d20 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
23d30 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
23d40 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
23d50 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
23d60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
23d70 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
23d80 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
23d90 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
23da0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
23db0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
23dc0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
23dd0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
23de0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
23df0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
23e00 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
23e10 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
23e20 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
23e30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
23e40 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
23e50 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
23e60 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
23e70 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
23e80 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
23e90 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
23ea0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
23eb0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
23ec0 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
23ed0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
23ee0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23ef0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
23f00 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
23f10 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
23f20 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
23f30 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
23f40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23f50 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
23f60 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
23f70 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
23f80 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
23f90 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
23fa0 74 79 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ty"));..      /*
23fb0 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68   Begin a loop th
23fc0 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
23fd0 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20  all source rows 
23fe0 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
23ff0 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  r..      ** This
24000 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74   might involve t
24010 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70  wo separate loop
24020 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72  s with an OP_Sor
24030 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72  t in between, or
24040 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67  .      ** it mig
24050 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c  ht be a single l
24060 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e  oop that uses an
24070 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63   index to extrac
24080 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20  t information.  
24090 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69      ** in the ri
240a0 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67  ght order to beg
240b0 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a  in with..      *
240c0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
240d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
240e0 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
240f0 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
24100 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
24110 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
24120 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
24130 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42  pWhere, &pGroupB
24140 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  y, 0, 0);.      
24150 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
24160 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
24170 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75  .      if( pGrou
24180 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
24190 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
241a0 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
241b0 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
241c0 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
241d0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
241e0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
241f0 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
24200 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
24210 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
24220 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
24230 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
24240 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
24250 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
24260 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
24270 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
24280 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67  oupBy;.        g
24290 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
242a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
242b0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
242c0 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
242d0 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
242e0 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
242f0 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
24300 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
24310 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
24320 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
24330 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
24340 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
24350 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
24360 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
24370 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
24380 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
24390 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
243a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
243b0 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
243c0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
243d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
243e0 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
243f0 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
24400 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
24410 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
24420 20 20 20 20 20 20 20 20 69 73 44 69 73 74 69 6e          isDistin
24430 63 74 20 26 26 20 21 28 70 2d 3e 73 65 6c 46 6c  ct && !(p->selFl
24440 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
24450 3f 22 44 49 53 54 49 4e 43 54 22 3a 22 47 52 4f  ?"DISTINCT":"GRO
24460 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
24470 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
24480 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
24490 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
244a0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
244b0 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b  Col = nGroupBy +
244c0 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   1;.        j = 
244d0 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20  nGroupBy+1;.    
244e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
244f0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
24500 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
24510 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
24520 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
24530 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
24540 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
24550 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
24560 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
24580 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
24590 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
245a0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
245b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
245c0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
245d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
245e0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
245f0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
24600 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a  y, regBase, 0);.
24610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24620 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24630 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e  Sequence, sAggIn
24640 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65  fo.sortingIdx,re
24650 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b  gBase+nGroupBy);
24660 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
24670 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
24680 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
24690 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
246a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
246b0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
246c0 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e   *pCol = &sAggIn
246d0 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  fo.aCol[i];.    
246e0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
246f0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
24700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24710 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67  int r1 = j + reg
24720 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
24730 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20    int r2;..     
24740 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
24750 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
24760 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20  lumn(pParse, .  
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
24790 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69  l->pTab, pCol->i
247a0 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54  Column, pCol->iT
247b0 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  able, r1);.     
247c0 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d 72         if( r1!=r
247d0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
247e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
247f0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
24800 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  , r2, r1);.     
24810 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24820 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
24830 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24840 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72          regRecor
24850 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
24860 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
24870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
24880 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
24890 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
248a0 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63  se, nCol, regRec
248b0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
248c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
248d0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
248e0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
248f0 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
24900 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
24910 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
24920 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
24930 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
24940 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
24950 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
24960 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
24970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
24980 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
24990 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
249a0 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20  .sortingIdxPTab 
249b0 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61  = sortPTab = pPa
249c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
249d0 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73       sortOut = s
249e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
249f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
24a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24a10 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
24a20 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20  eudo, sortPTab, 
24a30 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a  sortOut, nCol);.
24a40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24a50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24a60 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67  SorterSort, sAgg
24a70 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
24a80 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
24a90 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
24aa0 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
24ab0 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41  t"));.        sA
24ac0 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
24ad0 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
24ae0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24af0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
24b00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
24b10 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
24b20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
24b30 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
24b40 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
24b50 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
24b60 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
24b70 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
24b80 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
24b90 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
24ba0 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
24bb0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
24bc0 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
24bd0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
24be0 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
24bf0 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
24c00 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
24c10 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
24c20 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
24c30 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
24c40 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
24c50 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
24c60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24c70 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
24c80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72  e);.      if( gr
24c90 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
24ca0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24cb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
24cc0 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66  terData, sAggInf
24cd0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f  o.sortingIdx, so
24ce0 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  rtOut);.      }.
24cf0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
24d00 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
24d10 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
24d20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
24d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
24d40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
24d50 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72  , OP_Column, sor
24d60 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b  tPTab, j, iBMem+
24d70 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j);.          if
24d80 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ( j==0 ) sqlite3
24d90 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
24da0 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
24db0 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  E);.        }els
24dc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
24dd0 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
24de0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
24df0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
24e00 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
24e10 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
24e20 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
24e30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
24e40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24e50 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
24e60 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
24e70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
24ea0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
24eb0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31  YINFO);.      j1
24ec0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
24ed0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
24ee0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24ef0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
24f00 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29  , j1+1, 0, j1+1)
24f10 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
24f20 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
24f30 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
24f40 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
24f50 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
24f60 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
24f70 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
24f80 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
24f90 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
24fa0 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
24fb0 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
24fc0 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
24fd0 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
24fe0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
24ff0 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
25000 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
25010 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
25020 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
25030 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
25040 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
25050 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
25060 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
25070 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
25080 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
25090 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
250a0 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
250b0 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
250c0 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
250d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
250e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
250f0 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
25100 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
25110 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
25120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25130 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
25140 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
25150 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
25160 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
25170 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
25180 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
25190 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
251a0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
251b0 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
251c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
251d0 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
251e0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
251f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25200 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
25210 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
25220 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
25230 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
25240 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
25250 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
25260 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
25270 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
25280 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
25290 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
252a0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
252b0 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
252c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
252d0 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
252e0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
252f0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
25300 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
25310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25320 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
25330 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
25340 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
25350 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
25360 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
25370 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
25380 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
25390 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
253a0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
253b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
253c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
253d0 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73  OP_SorterNext, s
253e0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
253f0 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
25400 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
25410 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25420 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
25430 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25440 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
25450 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
25460 49 64 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Idx, 1);.      }
25470 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
25480 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
25490 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
254a0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
254b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
254c0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
254d0 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
254e0 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
254f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
25500 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
25510 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
25520 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75   over the subrou
25530 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20  tines.      */. 
25540 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25550 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
25560 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a  o, 0, addrEnd);.
25570 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
25580 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
25590 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
255a0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
255b0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
255c0 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
255d0 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
255e0 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
255f0 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
25600 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
25610 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
25620 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
25630 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
25640 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
25650 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
25660 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
25670 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
25680 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
25690 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
256a0 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
256b0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
256c0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
256d0 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
256e0 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
256f0 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
25700 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
25710 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
25720 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
25730 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
25740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25750 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
25760 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 1, iAbortFlag
25770 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
25780 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62  ment((v, "set ab
25790 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
257a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
257b0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
257c0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
257d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
257e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
257f0 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  v, addrOutputRow
25800 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
25810 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
25820 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
25830 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
25840 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
25850 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61  P_IfPos, iUseFla
25860 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
25870 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
25880 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
25890 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
258a0 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
258b0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
258c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
258d0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
258e0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
258f0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
25900 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
25910 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
25920 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
25930 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
25940 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
25950 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  +1, SQLITE_JUMPI
25960 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
25970 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
25980 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
25990 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
259a0 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
259b0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e            distin
259c0 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259e0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
259f0 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b  , addrSetAbort);
25a00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
25a10 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
25a20 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
25a30 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
25a40 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
25a50 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20   groupby result 
25a60 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20  generator"));.. 
25a70 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
25a80 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
25a90 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68  at will reset th
25aa0 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d  e group-by accum
25ab0 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a  ulator.      */.
25ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25ad0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
25ae0 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
25af0 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
25b00 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
25b10 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
25b20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
25b30 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
25b40 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20  gReset);.     . 
25b50 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47     } /* endif pG
25b60 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61  roupBy.  Begin a
25b70 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
25b80 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42   without GROUP B
25b90 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b  Y: */.    else {
25ba0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
25bb0 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64  *pDel = 0;.#ifnd
25bc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
25bd0 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20  TREECOUNT.      
25be0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
25bf0 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69     if( (pTab = i
25c00 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20  sSimpleCount(p, 
25c10 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29  &sAggInfo))!=0 )
25c20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
25c30 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20  isSimpleCount() 
25c40 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
25c50 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72  r to a Table str
25c60 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20  ucture, then.   
25c70 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20       ** the SQL 
25c80 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20  statement is of 
25c90 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20  the form:.      
25ca0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
25cb0 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
25cc0 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20  ) FROM <tbl>.   
25cd0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
25ce0 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62  ** where the Tab
25cf0 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  le structure ret
25d00 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73  urned represents
25d10 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20   table <tbl>..  
25d20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
25d30 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   ** This stateme
25d40 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20  nt is so common 
25d50 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d  that it is optim
25d60 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20  ized specially. 
25d70 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  The.        ** O
25d80 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74  P_Count instruct
25d90 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20  ion is executed 
25da0 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e  either on the in
25db0 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a  tkey table that.
25dc0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
25dd0 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72  ins the data for
25de0 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20   table <tbl> or 
25df0 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e  on one of its in
25e00 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20  dexes. It.      
25e10 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74    ** is better t
25e20 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70  o execute the op
25e30 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73   on an index, as
25e40 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d   indexes are alm
25e50 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ost.        ** a
25e60 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72  lways spread acr
25e70 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74  oss less pages t
25e80 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73  han their corres
25e90 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a  ponding tables..
25ea0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25eb0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62     const int iDb
25ec0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
25ed0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
25ee0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
25ef0 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  a);.        cons
25f00 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61  t int iCsr = pPa
25f10 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
25f20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63   /* Cursor to sc
25f30 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  an b-tree */.   
25f40 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
25f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
25f70 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
25f80 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  /.        KeyInf
25f90 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25fb0 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63  * Keyinfo for sc
25fc0 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  anned index */. 
25fd0 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42         Index *pB
25fe0 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
26000 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20  est index found 
26010 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
26020 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54    int iRoot = pT
26030 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20  ab->tnum;       
26040 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
26050 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62  age of scanned b
26060 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20  -tree */..      
26070 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
26080 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
26090 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
260a0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
260b0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
260c0 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
260d0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
260e0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
260f0 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  r the index that
26100 20 68 61 73 20 74 68 65 20 6c 65 61 73 74 20 61   has the least a
26110 6d 6f 75 6e 74 20 6f 66 20 63 6f 6c 75 6d 6e 73  mount of columns
26120 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  . If.        ** 
26130 74 68 65 72 65 20 69 73 20 73 75 63 68 20 61 6e  there is such an
26140 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 74 20 68   index, and it h
26150 61 73 20 6c 65 73 73 20 63 6f 6c 75 6d 6e 73 20  as less columns 
26160 74 68 61 6e 20 74 68 65 20 74 61 62 6c 65 0a 20  than the table. 
26170 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20         ** does, 
26180 74 68 65 6e 20 77 65 20 63 61 6e 20 61 73 73 75  then we can assu
26190 6d 65 20 74 68 61 74 20 69 74 20 63 6f 6e 73 75  me that it consu
261a0 6d 65 73 20 6c 65 73 73 20 73 70 61 63 65 20 6f  mes less space o
261b0 6e 20 64 69 73 6b 20 61 6e 64 0a 20 20 20 20 20  n disk and.     
261c0 20 20 20 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65     ** will there
261d0 66 6f 72 65 20 62 65 20 63 68 65 61 70 65 72 20  fore be cheaper 
261e0 74 6f 20 73 63 61 6e 20 74 6f 20 64 65 74 65 72  to scan to deter
261f0 6d 69 6e 65 20 74 68 65 20 71 75 65 72 79 20 72  mine the query r
26200 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
26210 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73  * In this case s
26220 65 74 20 69 52 6f 6f 74 20 74 6f 20 74 68 65 20  et iRoot to the 
26230 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
26240 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62 2d   of the index b-
26250 74 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  tree.        ** 
26260 61 6e 64 20 70 4b 65 79 49 6e 66 6f 20 74 6f 20  and pKeyInfo to 
26270 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
26280 63 74 75 72 65 20 72 65 71 75 69 72 65 64 20 74  cture required t
26290 6f 20 6e 61 76 69 67 61 74 65 20 74 68 65 0a 20  o navigate the. 
262a0 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e         ** index.
262b0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
262c0 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d      ** (2011-04-
262d0 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20  15) Do not do a 
262e0 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20  full scan of an 
262f0 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e  unordered index.
26300 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
26310 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69      ** In practi
26320 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ce the KeyInfo s
26330 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f  tructure will no
26340 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73  t be used. It is
26350 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a   only .        *
26360 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70  * passed to keep
26370 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70   OP_OpenRead hap
26380 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  py..        */. 
26390 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
263a0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
263b0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
263c0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
263d0 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
263e0 64 65 72 65 64 3d 3d 30 20 26 26 20 28 21 70 42  dered==0 && (!pB
263f0 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f  est || pIdx->nCo
26400 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f 6c  lumn<pBest->nCol
26410 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  umn) ){.        
26420 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
26430 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26450 69 66 28 20 70 42 65 73 74 20 26 26 20 70 42 65  if( pBest && pBe
26460 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62  st->nColumn<pTab
26470 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
26480 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73      iRoot = pBes
26490 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  t->tnum;.       
264a0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
264b0 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
264c0 6f 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  o(pParse, pBest)
264d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
264e0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
264f0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
26500 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
26510 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
26520 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
26530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26540 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
26550 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
26560 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  t, iDb);.       
26570 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
26580 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26590 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
265a0 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
265b0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
265c0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
265d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
265e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
265f0 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43  (v, OP_Count, iC
26600 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  sr, sAggInfo.aFu
26610 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  nc[0].iMem);.   
26620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26630 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
26640 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20  se, iCsr);.     
26650 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65     explainSimple
26660 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54  Count(pParse, pT
26670 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  ab, pBest);.    
26680 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
26690 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  * SQLITE_OMIT_BT
266a0 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20  REECOUNT */.    
266b0 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43    {.        /* C
266c0 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72  heck if the quer
266d0 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  y is of one of t
266e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
266f0 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ms:.        **. 
26700 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
26710 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e  CT min(x) FROM .
26720 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ...        **   
26730 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
26740 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
26750 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  *.        ** If 
26760 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20  it is, then ask 
26770 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72  the code in wher
26780 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74  e.c to attempt t
26790 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20  o sort results. 
267a0 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20         ** as if 
267b0 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
267c0 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52  DER ON x" or "OR
267d0 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63  DER ON x DESC" c
267e0 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20  lause. .        
267f0 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73  ** If where.c is
26800 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65   able to produce
26810 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20   results sorted 
26820 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74  in this order, t
26830 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
26840 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20  dd vdbe code to 
26850 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
26860 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70   processing loop
26870 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
26880 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65      ** first ite
26890 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68  ration (since th
268a0 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
268b0 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73  n of the loop is
268c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61   .        ** gua
268d0 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61  ranteed to opera
268e0 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69  te on the row wi
268f0 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f  th the minimum o
26900 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20  r maximum .     
26910 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78     ** value of x
26920 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72  , the only row r
26930 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20  equired)..      
26940 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26950 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d  A special flag m
26960 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f  ust be passed to
26970 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
26980 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79  in() to slightly
26990 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69  .        ** modi
269a0 66 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20  fy behaviour as 
269b0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20  follows:.       
269c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
269d0 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20   + If the query 
269e0 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  is a "SELECT min
269f0 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c  (x)", then the l
26a00 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20  oop coded by.   
26a10 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72       **     wher
26a20 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69  e.c should not i
26a30 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20  terate over any 
26a40 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55  values with a NU
26a50 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  LL value.       
26a60 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20   **     for x.. 
26a70 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26a80 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74    **   + The opt
26a90 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77  imizer code in w
26aa0 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e  here.c (the thin
26ab0 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77  g that decides w
26ac0 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
26ad0 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64      index or ind
26ae0 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f  ices to use) sho
26af0 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66  uld place a diff
26b00 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f  erent priority o
26b10 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  n .        **   
26b20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65    satisfying the
26b30 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75   'ORDER BY' clau
26b40 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20  se than it does 
26b50 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  in other cases..
26b60 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52          **     R
26b70 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64  efer to code and
26b80 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65   comments in whe
26b90 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73  re.c for details
26ba0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26bb0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
26bc0 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20  MinMax = 0;.    
26bd0 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 6d 69      u8 flag = mi
26be0 6e 4d 61 78 51 75 65 72 79 28 70 29 3b 0a 20 20  nMaxQuery(p);.  
26bf0 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29        if( flag )
26c00 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
26c10 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
26c20 65 72 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  erty(p->pEList->
26c30 61 5b 30 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  a[0].pExpr, EP_x
26c40 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
26c50 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d         pMinMax =
26c60 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
26c70 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
26c80 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78  t->a[0].pExpr->x
26c90 2e 70 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20  .pList,0);.     
26ca0 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
26cb0 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Max;.          i
26cc0 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64  f( pMinMax && !d
26cd0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
26ce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
26cf0 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
26d00 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
26d10 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
26d20 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20   ?1:0;.         
26d30 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
26d40 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
26d50 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
26d60 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
26d70 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
26d80 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
26d90 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
26da0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
26db0 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  se.  The.       
26dc0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
26dd0 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
26de0 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
26df0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
26e00 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75          ** of ou
26e10 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tput..        */
26e20 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63  .        resetAc
26e30 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
26e40 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
26e50 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
26e60 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
26e70 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
26e80 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e  t, pWhere, &pMin
26e90 4d 61 78 2c 20 30 2c 20 66 6c 61 67 29 3b 0a 20  Max, 0, flag);. 
26ea0 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66         if( pWInf
26eb0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
26ec0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
26ed0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
26ee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
26ef0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
26f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26f10 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
26f20 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
26f30 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
26f40 28 20 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c  ( !pMinMax && fl
26f50 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
26f60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26f70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
26f80 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
26f90 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
26fa0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28  Comment((v, "%s(
26fb0 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20  ) by index",.   
26fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
26fd0 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
26fe0 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
26ff0 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ")));.        }.
27000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
27010 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
27020 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  .        finaliz
27030 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
27040 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
27050 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27060 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
27070 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27080 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
27090 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
270a0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
270b0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
270c0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
270d0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
270e0 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a  , 0, 0, 0, -1, .
270f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27100 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
27110 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
27120 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27130 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
27140 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
27150 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27160 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
27170 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
27180 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
27190 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
271a0 28 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  ( distinct>=0 ){
271b0 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
271c0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
271d0 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
271e0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
271f0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
27200 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
27210 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
27220 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
27230 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
27240 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
27250 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
27260 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
27270 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
27280 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45 52 20  (pParse, "ORDER 
27290 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61  BY");.    genera
272a0 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
272b0 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
272c0 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
272d0 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
272e0 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
272f0 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
27300 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
27310 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
27320 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
27330 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
27340 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
27350 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
27360 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
27370 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
27380 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
27390 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
273a0 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
273b0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
273c0 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
273d0 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
273e0 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
273f0 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
27400 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78  select_end:.  ex
27410 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
27420 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
27430 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
27440 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  tId);..  /* Iden
27450 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
27460 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20  s if results of 
27470 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74  the SELECT are t
27480 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  o be output..  *
27490 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
274a0 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e  TE_OK && pDest->
274b0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
274c0 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
274d0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
274e0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
274f0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
27500 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
27510 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
27520 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
27530 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
27540 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
27550 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
27560 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
27570 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
27580 74 45 78 70 72 28 45 78 70 72 20 2a 70 29 3b 0a  tExpr(Expr *p);.
27590 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
275a0 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  tExprList(ExprLi
275b0 73 74 20 2a 70 4c 69 73 74 29 3b 0a 76 6f 69 64  st *pList);.void
275c0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
275d0 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
275e0 6e 74 20 69 6e 64 65 6e 74 29 3b 0a 2f 2a 0a 2a  nt indent);./*.*
275f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
27640 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
27650 63 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72  code is used for
27660 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
27670 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68  ugging only.  Th
27680 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66  e code.** that f
27690 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  ollows does not 
276a0 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c  appear in normal
276b0 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54   builds..**.** T
276c0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
276d0 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20  e used to print 
276e0 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
276f0 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f  of all or part o
27700 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74  f a .** parse st
27710 72 75 63 74 75 72 65 73 20 73 75 63 68 20 61 73  ructures such as
27720 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e   Select or Expr.
27730 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73    Such printouts
27740 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66   are useful.** f
27750 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e  or helping to un
27760 64 65 72 73 74 61 6e 64 20 77 68 61 74 20 69 73  derstand what is
27770 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64   happening insid
27780 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  e the code gener
27790 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74  ator.** during t
277a0 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
277b0 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73  complex SELECT s
277c0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
277d0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61   These routine a
277e0 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e  re not called an
277f0 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68  ywhere from with
27800 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a  in the normal.**
27810 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65   code base.  The
27820 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74  n are intended t
27830 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  o be called from
27840 20 77 69 74 68 69 6e 20 74 68 65 20 64 65 62 75   within the debu
27850 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20  gger.** or from 
27860 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74  temporary "print
27870 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  f" statements in
27880 73 65 72 74 65 64 20 66 6f 72 20 64 65 62 75 67  serted for debug
27890 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ging..*/.void sq
278a0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45  lite3PrintExpr(E
278b0 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21  xpr *p){.  if( !
278c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
278d0 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
278e0 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
278f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
27900 75 67 50 72 69 6e 74 66 28 22 28 25 73 22 2c 20  ugPrintf("(%s", 
27910 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
27920 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
27930 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
27940 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d  %d", p->op);.  }
27950 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20  .  if( p->pLeft 
27960 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
27970 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a  bugPrintf(" ");.
27980 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
27990 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a  Expr(p->pLeft);.
279a0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69    }.  if( p->pRi
279b0 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
279c0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
279d0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
279e0 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67  rintExpr(p->pRig
279f0 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ht);.  }.  sqlit
27a00 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29  e3DebugPrintf(")
27a10 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  ");.}.void sqlit
27a20 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
27a30 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
27a40 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
27a50 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
27a60 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
27a70 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
27a80 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
27a90 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pr);.    if( i<p
27aa0 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b  List->nExpr-1 ){
27ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
27ac0 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b  bugPrintf(", ");
27ad0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
27ae0 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65  d sqlite3PrintSe
27af0 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
27b00 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73  int indent){.  s
27b10 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
27b20 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29  f("%*sSELECT(%p)
27b30 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20   ", indent, "", 
27b40 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69  p);.  sqlite3Pri
27b50 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  ntExprList(p->pE
27b60 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
27b70 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
27b80 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  );.  if( p->pSrc
27b90 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50   ){.    char *zP
27ba0 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69  refix;.    int i
27bb0 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20  ;.    zPrefix = 
27bc0 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28  "FROM";.    for(
27bd0 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e  i=0; i<p->pSrc->
27be0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
27bf0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27c00 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
27c10 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  p->pSrc->a[i];. 
27c20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
27c30 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20  gPrintf("%*s ", 
27c40 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69  indent+6, zPrefi
27c50 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69  x);.      zPrefi
27c60 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66  x = "";.      if
27c70 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
27c80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27c90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
27ca0 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73  (\n");.        s
27cb0 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63  qlite3PrintSelec
27cc0 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  t(pItem->pSelect
27cd0 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20  , indent+10);.  
27ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
27cf0 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c  ugPrintf("%*s)",
27d00 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a   indent+8, "");.
27d10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27d20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  pItem->zName ){.
27d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
27d40 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c  ebugPrintf("%s",
27d50 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
27d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27d70 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b  ( pItem->pTab ){
27d80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27d90 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 74 61  DebugPrintf("(ta
27da0 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d  ble: %s)", pItem
27db0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
27dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27dd0 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
27de0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27df0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
27e00 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  AS %s", pItem->z
27e10 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a  Alias);.      }.
27e20 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70        if( i<p->p
27e30 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20  Src->nSrc-1 ){. 
27e40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
27e50 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a  bugPrintf(",");.
27e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
27e70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27e80 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ("\n");.    }.  
27e90 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  }.  if( p->pWher
27ea0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
27eb0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
27ec0 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74   WHERE ", indent
27ed0 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  , "");.    sqlit
27ee0 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
27ef0 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
27f00 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
27f10 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
27f20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  p->pGroupBy ){. 
27f30 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27f40 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50  rintf("%*s GROUP
27f50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22   BY ", indent, "
27f60 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
27f70 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
27f80 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
27f90 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
27fa0 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  f("\n");.  }.  i
27fb0 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b  f( p->pHaving ){
27fc0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
27fd0 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56  gPrintf("%*s HAV
27fe0 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22  ING ", indent, "
27ff0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
28000 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76  rintExpr(p->pHav
28010 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
28020 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
28030 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
28040 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
28050 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
28060 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42  ntf("%*s ORDER B
28070 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  Y ", indent, "")
28080 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
28090 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  ntExprList(p->pO
280a0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
280b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
280c0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20  "\n");.  }.}./* 
280d0 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63  End of the struc
280e0 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74  ture debug print
280f0 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a  ing code.*******
28100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28140 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
28150 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
28160 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
28170 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
28180 2a 2f 0a                                         */.