/ Hex Artifact Content
Login

Artifact 74fef1334bec27e606ef0b19e5c41cd0a639e69c:


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 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
37e0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
37f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3800: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
3810: 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  , pOrderBy, regB
3820: 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ase, 0);.  sqlit
3830: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3840: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
3850: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3860: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
3870: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
3880: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
3890: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
38a0: 6e 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73  nExpr+1, 1);.  s
38b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
38c0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
38d0: 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  d, regBase, nExp
38e0: 72 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64  r + 2, regRecord
38f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3900: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
3910: 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79  Insert, pOrderBy
3920: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
3930: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
3940: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
3950: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
3960: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
3970: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
3980: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
3990: 45 78 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70  Expr+2);.  if( p
39a0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29  Select->iLimit )
39b0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
39c0: 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20   addr2;.    int 
39d0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
39e0: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
39f0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
3a00: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
3a10: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
3a20: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
3a30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
3a50: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
3a60: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
3a70: 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  ro, iLimit);.   
3a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3a90: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
3aa0: 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20   iLimit, -1);.  
3ab0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
3ac0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
3ad0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c  P_Goto);.    sql
3ae0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3af0: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
3b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b10: 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f  1(v, OP_Last, pO
3b20: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3b30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3b40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
3b50: 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d  elete, pOrderBy-
3b60: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
3b70: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3b80: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
3b90: 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d     pSelect->iLim
3ba0: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  it = 0;.  }.}../
3bb0: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
3bc0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
3bd0: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
3be0: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
3bf0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
3c00: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
3c10: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
3c20: 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  VM */.  Select *
3c30: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
3c40: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3c50: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
3c60: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
3c70: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
3c80: 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75  e to skip the cu
3c90: 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a  rrent record */.
3ca0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66  ){.  if( p->iOff
3cb0: 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65  set && iContinue
3cc0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  !=0 ){.    int a
3cd0: 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ddr;.    sqlite3
3ce0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3cf0: 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66  _AddImm, p->iOff
3d00: 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64  set, -1);.    ad
3d10: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
3d20: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
3d30: 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b  eg, p->iOffset);
3d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3d50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
3d60: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
3d70: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
3d80: 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53  t((v, "skip OFFS
3d90: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
3da0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3db0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
3dc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3dd0: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
3de0: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
3df0: 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74  ure the N regist
3e00: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
3e10: 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64  iMem.** form a d
3e20: 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20  istinct entry.  
3e30: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
3e40: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
3e50: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
3e60: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
3e70: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
3e80: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
3e90: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
3ea0: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
3eb0: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
3ec0: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
3ed0: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
3ee0: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
3ef0: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
3f00: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
3f10: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
3f20: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
3f30: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
3f40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3f50: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50  odeDistinct(.  P
3f60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3f70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
3f80: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
3f90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
3fa0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
3fb0: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
3fc0: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
3fd0: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
3fe0: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
3ff0: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
4000: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
4010: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
4020: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
4030: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
4040: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
4050: 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20   iMem           
4060: 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74  /* First element
4070: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
4080: 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76  ;.  int r1;..  v
4090: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
40a0: 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
40b0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
40c0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
40d0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
40e0: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
40f0: 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20  drRepeat, iMem, 
4100: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  N);.  sqlite3Vdb
4110: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4120: 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20  keRecord, iMem, 
4130: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
4140: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4150: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
4160: 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  b, r1);.  sqlite
4170: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
4180: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
4190: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
41a0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
41b0: 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73  when a SELECT is
41c0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73   used within a s
41d0: 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
41e0: 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e  (example:  "a IN
41f0: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
4200: 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20  table)") but it 
4210: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20  has more than 1 
4220: 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  result.** column
4230: 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e  .  We do this in
4240: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65   a subroutine be
4250: 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20  cause the error 
4260: 6f 63 63 75 72 73 20 69 6e 20 6d 75 6c 74 69 70  occurs in multip
4270: 6c 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f  le.** places..*/
4280: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
4290: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
42a0: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
42b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
42c0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
42d0: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
42e0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
42f0: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
4300: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
4310: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
4320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4330: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
4340: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
4350: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
4360: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4370: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
4380: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
4390: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
43a0: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
43b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
43c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
43d0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
43e0: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
43f0: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
4400: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
4410: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
4420: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
4430: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
4440: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
4450: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4460: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
4470: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
4480: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
4490: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
44a0: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
44b0: 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75  srcTab and nColu
44c0: 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f  mn are both zero
44d0: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
44e0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
44f0: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
4500: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
4510: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
4520: 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d   row.  If nColum
4530: 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61  n>0.** then data
4540: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
4550: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
4560: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  t is used only t
4570: 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o get the.** dat
4580: 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20  atypes for each 
4590: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
45a0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
45b0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
45c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
45d0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
45e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
45f0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
4600: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
4610: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
4620: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
4630: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
4640: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
4650: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
4660: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
4670: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
4680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4690: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
46a0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
46b0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
46c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
46d0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
46e0: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
46f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4700: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
4710: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
4720: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
4730: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69   this key */.  i
4740: 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20  nt distinct,    
4750: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30         /* If >=0
4760: 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75  , make sure resu
4770: 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74  lts are distinct
4780: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
4790: 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
47a0: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
47b0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
47c0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
47d0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
47e0: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
47f0: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
4800: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
4810: 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
4820: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
4830: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
4840: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29   inner loop */.)
4850: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4860: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
4870: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
4880: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
4890: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
48a0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
48b0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
48c0: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
48e0: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
48f0: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65  olding result se
4900: 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  t */.  int eDest
4910: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
4920: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
4930: 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20  pose of results 
4940: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  */.  int iParm =
4950: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 20 20   pDest->iParm;  
4960: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
4970: 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d  nt to disposal m
4980: 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ethod */.  int n
4990: 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20  ResultCol;      
49a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
49b0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
49c0: 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ns */..  assert(
49d0: 20 76 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45   v );.  if( NEVE
49e0: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
49f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
4a00: 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69  st!=0 );.  hasDi
4a10: 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63  stinct = distinc
4a20: 74 3e 3d 30 3b 0a 20 20 69 66 28 20 70 4f 72 64  t>=0;.  if( pOrd
4a30: 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44  erBy==0 && !hasD
4a40: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63  istinct ){.    c
4a50: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
4a60: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  iContinue);.  }.
4a70: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
4a80: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
4a90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f  ..  */.  if( nCo
4aa0: 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e 52  lumn>0 ){.    nR
4ab0: 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c 75  esultCol = nColu
4ac0: 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mn;.  }else{.   
4ad0: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45   nResultCol = pE
4ae0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
4af0: 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d  .  if( pDest->iM
4b00: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65  em==0 ){.    pDe
4b10: 73 74 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  st->iMem = pPars
4b20: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
4b30: 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e 52 65  Dest->nMem = nRe
4b40: 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 50 61  sultCol;.    pPa
4b50: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
4b60: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
4b70: 7b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  { .    assert( p
4b80: 44 65 73 74 2d 3e 6e 4d 65 6d 3d 3d 6e 52 65 73  Dest->nMem==nRes
4b90: 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20  ultCol );.  }.  
4ba0: 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73  regResult = pDes
4bb0: 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28 20 6e  t->iMem;.  if( n
4bc0: 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20  Column>0 ){.    
4bd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
4be0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
4bf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c00: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
4c10: 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65  srcTab, i, regRe
4c20: 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20  sult+i);.    }. 
4c30: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
4c40: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
4c50: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
4c60: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
4c70: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
4c80: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
4c90: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
4ca0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
4cb0: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
4cc0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
4cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4ce0: 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
4cf0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
4d00: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
4d10: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
4d20: 72 65 67 52 65 73 75 6c 74 2c 20 65 44 65 73 74  regResult, eDest
4d30: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a 20  ==SRT_Output);. 
4d40: 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e   }.  nColumn = n
4d50: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a  ResultCol;..  /*
4d60: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
4d70: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
4d80: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
4d90: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
4da0: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
4db0: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
4dc0: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
4dd0: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
4de0: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
4df0: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
4e00: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
4e10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
4e20: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
4e30: 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
4e40: 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  Expr==nColumn );
4e50: 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63  .    codeDistinc
4e60: 74 28 70 50 61 72 73 65 2c 20 64 69 73 74 69 6e  t(pParse, distin
4e70: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
4e80: 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75 6c  Column, regResul
4e90: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  t);.    if( pOrd
4ea0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
4eb0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
4ec0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
4ed0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63    }.  }..  if( c
4ee0: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
4ef0: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
4f00: 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
4f10: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
4f20: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
4f30: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
4f40: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
4f50: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
4f60: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
4f70: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
4f80: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
4f90: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
4fa0: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
4fb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
4fc0: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63  UND_SELECT.    c
4fd0: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b  ase SRT_Union: {
4fe0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
4ff0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
5000: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
5010: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
5020: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5030: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
5040: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5050: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  n, r1);.      sq
5060: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5070: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
5080: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
5090: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
50a0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
50b0: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
50c0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
50d0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
50e0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
50f0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
5100: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
5110: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
5120: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
5130: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
5140: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
5150: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
5160: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
5170: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5180: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
5190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
51a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
51b0: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
51c0: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29  Result, nColumn)
51d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
51e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
51f0: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
5200: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
5210: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
5220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5230: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
5240: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
5250: 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
5260: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
5270: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5280: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
5290: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
52a0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
52b0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  e( eDest==SRT_Ep
52c0: 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
52d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
52e0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
52f0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
5300: 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20  Column, r1);.   
5310: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
5320: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
5330: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5340: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5350: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
5360: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
5370: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5380: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
5390: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
53a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
53b0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
53c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
53d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
53e0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
53f0: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
5400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5410: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
5420: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
5430: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5440: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5450: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
5460: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
5470: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5480: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
5490: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
54a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
54b0: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
54c0: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
54d0: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
54e0: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
54f0: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
5500: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
5510: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
5520: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
5530: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
5540: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
5550: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
5560: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
5570: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
5580: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
5590: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
55a0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
55b0: 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73   p->affinity = s
55c0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
55d0: 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b  inity(pEList->a[
55e0: 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
55f0: 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20  >affinity);.    
5600: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5610: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
5620: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
5630: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
5640: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
5650: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
5660: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
5670: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
5680: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
5690: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
56a0: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
56b0: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
56c0: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
56d0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
56e0: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
56f0: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
5700: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
5710: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5720: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
5730: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52  OrderBy, p, regR
5740: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65  esult);.      }e
5750: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
5760: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5770: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5780: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5790: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
57a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
57b0: 52 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26  Result, 1, r1, &
57c0: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
57d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
57e0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
57f0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
5800: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
5810: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5820: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5830: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
5840: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
5850: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5860: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5880: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5890: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
58a0: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
58b0: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
58c0: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
58d0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
58e0: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
58f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5900: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5910: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72  Integer, 1, iPar
5920: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
5930: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
5940: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
5950: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
5960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5970: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5980: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
5990: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
59a0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
59b0: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
59c0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
59d0: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
59e0: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
59f0: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
5a00: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
5a10: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
5a20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
5a30: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5a40: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
5a50: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
5a60: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
5a70: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5a80: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5a90: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
5aa0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5ab0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
5ac0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
5ad0: 65 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c  egResult, iParm,
5ae0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20   1);.        /* 
5af0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
5b00: 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
5b10: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
5b20: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
5b30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5b40: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
5b50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
5b60: 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
5b70: 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20  * Send the data 
5b80: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
5b90: 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61  function or to a
5ba0: 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e   subroutine.  In
5bb0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65   the.    ** case
5bc0: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
5bd0: 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
5be0: 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f   itself is respo
5bf0: 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a  nsible for.    *
5c00: 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61  * popping the da
5c10: 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ta from the stac
5c20: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  k..    */.    ca
5c30: 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
5c40: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f  :.    case SRT_O
5c50: 75 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 74  utput: {.      t
5c60: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
5c70: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
5c80: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5c90: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
5ca0: 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
5cb0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5cc0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
5cd0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5ce0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5cf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d00: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5d10: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
5d20: 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20  Column, r1);.   
5d30: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
5d40: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
5d50: 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20  erBy, p, r1);.  
5d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
5d70: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
5d80: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  se, r1);.      }
5d90: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d  else if( eDest==
5da0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
5db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5dc0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5dd0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
5de0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Parm);.      }el
5df0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5e00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5e10: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
5e20: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5e30: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
5e40: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
5e50: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
5e60: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  e, regResult, nC
5e70: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
5e80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5e90: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
5ea0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
5eb0: 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
5ec0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
5ed0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
5ee0: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
5ef0: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
5f00: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
5f10: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
5f20: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
5f30: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
5f40: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
5f50: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
5f60: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
5f70: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
5f80: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
5f90: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
5fa0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
5fb0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
5fc0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5fd0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
5fe0: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
5ff0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6000: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
6010: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
6020: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
6030: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
6040: 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
6050: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
6060: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6070: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 20 20 2f  OrderBy==0 );  /
6080: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
6090: 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 63   ORDER BY, the c
60a0: 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20  all to.         
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 2a 2a 20 70 75 73 68 4f 6e 74 6f 53 6f     ** pushOntoSo
60d0: 72 74 65 72 28 29 20 77 6f 75 6c 64 20 68 61 76  rter() would hav
60e0: 65 20 63 6c 65 61 72 65 64 20 70 2d 3e 69 4c 69  e cleared p->iLi
60f0: 6d 69 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  mit */.    sqlit
6100: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6110: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
6120: 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31  imit, iBreak, -1
6130: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6140: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
6150: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
6160: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
6170: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
6180: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
6190: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
61a0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
61b0: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
61c0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
61d0: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
61e0: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
61f0: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
6200: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
6210: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
6220: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
6230: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
6240: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
6250: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
6260: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
6270: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
6280: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
6290: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
62a0: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
62b0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
62c0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
62d0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
62e0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
62f0: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
6300: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
6310: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
6320: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
6330: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
6340: 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d  is obtain from m
6350: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
6360: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
6370: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
6380: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
6390: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
63a0: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
63b0: 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b  reed.  Add the K
63c0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
63d0: 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c 64   to the P4 field
63e0: 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73   of an opcode us
63f0: 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46  ing.** P4_KEYINF
6400: 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65  O_HANDOFF is the
6410: 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65   usual way of de
6420: 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e  aling with this.
6430: 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
6440: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
6450: 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70  xprList(Parse *p
6460: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
6470: 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pList){.  sqlit
6480: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6490: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  >db;.  int nExpr
64a0: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
64b0: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
64c0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
64d0: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  m;.  int i;..  n
64e0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
64f0: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
6500: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6510: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
6520: 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73  Info) + nExpr*(s
6530: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
6540: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
6550: 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  o ){.    pInfo->
6560: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
6570: 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  *)&pInfo->aColl[
6580: 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66  nExpr];.    pInf
6590: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  o->nField = (u16
65a0: 29 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66  )nExpr;.    pInf
65b0: 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  o->enc = ENC(db)
65c0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64 62 20  ;.    pInfo->db 
65d0: 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = db;.    for(i=
65e0: 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
65f0: 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  a; i<nExpr; i++,
6600: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
6610: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6620: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
6630: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
6640: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
6650: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
6660: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
6670: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
6680: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
6690: 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d    }.      pInfo-
66a0: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
66b0: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
66c0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
66d0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
66e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
66f0: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a  turn pInfo;.}...
6700: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
6710: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
6720: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
6730: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
6740: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
6750: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
6760: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
6770: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
6780: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
6790: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
67a0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
67b0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
67c0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
67d0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
67e0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
67f0: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
6800: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
6810: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
6820: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
6830: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
6840: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
6850: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
6860: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
6870: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6880: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20   */.  Vdbe *v,  
6890: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
68a0: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
68b0: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
68c0: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
68d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
68e0: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
68f0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
6900: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
6910: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
6920: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
6930: 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
6940: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
6950: 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70  (v);     /* Jump
6960: 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f   here to exit lo
6970: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
6980: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
6990: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
69a0: 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  v);  /* Jump her
69b0: 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65  e for next cycle
69c0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a   */.  int addr;.
69d0: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e    int iTab;.  in
69e0: 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b  t pseudoTab = 0;
69f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
6a00: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
6a10: 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73  rBy;..  int eDes
6a20: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
6a30: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
6a40: 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20  pDest->iParm;.. 
6a50: 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69   int regRow;.  i
6a60: 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20  nt regRowid;..  
6a70: 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d  iTab = pOrderBy-
6a80: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65 67  >iECursor;.  reg
6a90: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Row = sqlite3Get
6aa0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6ab0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
6ac0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
6ad0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6ae0: 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61   ){.    pseudoTa
6af0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
6b00: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
6b10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b20: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75  OpenPseudo, pseu
6b30: 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20 6e  doTab, regRow, n
6b40: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65 67  Column);.    reg
6b50: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c  Rowid = 0;.  }el
6b60: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
6b70: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
6b80: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
6b90: 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73  }.  addr = 1 + s
6ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6bb0: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
6bc0: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
6bd0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
6be0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
6bf0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6c00: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
6c10: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
6c20: 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 72 65  y->nExpr + 1, re
6c30: 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63 68 28  gRow);.  switch(
6c40: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
6c50: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
6c60: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
6c70: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  Tab: {.      tes
6c80: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
6c90: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
6ca0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
6cb0: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
6cc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6cd0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6ce0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
6cf0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6d00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6d10: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
6d20: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c  , iParm, regRow,
6d30: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6d50: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
6d60: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62  APPEND);.      b
6d70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
6d80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6d90: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
6da0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
6db0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
6dc0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
6dd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6de0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6df0: 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65  d, regRow, 1, re
6e00: 67 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66 69  gRowid, &p->affi
6e10: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
6e20: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6e30: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
6e40: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31  Parse, regRow, 1
6e50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6e60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6e70: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
6e80: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
6e90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6ea0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
6eb0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
6ec0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6ed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6ee0: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
6ef0: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
6f00: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
6f10: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
6f20: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
6f30: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
6f40: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
6f50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
6f60: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
6f70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73   int i;.      as
6f80: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
6f90: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
6fa0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6fb0: 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61  ); .      testca
6fc0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
6fd0: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74  utput );.      t
6fe0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
6ff0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
7000: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7010: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
7020: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7030: 20 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e   regRow!=pDest->
7040: 69 4d 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20  iMem+i );.      
7050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7060: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
7070: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20  , pseudoTab, i, 
7080: 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a  pDest->iMem+i);.
7090: 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30          if( i==0
70a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
70b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
70c0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41  5(v, OPFLAG_CLEA
70d0: 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20  RCACHE);.       
70e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
70f0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
7100: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
7110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7120: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
7130: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  Row, pDest->iMem
7140: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
7150: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7160: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
7170: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
7180: 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29  ->iMem, nColumn)
7190: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
71a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
71b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
71c0: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61  ield, pDest->iPa
71d0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
71e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
71f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
7200: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
7210: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
7220: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7230: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
7240: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 4c 49  Rowid);..  /* LI
7250: 4d 49 54 20 68 61 73 20 62 65 65 6e 20 69 6d 70  MIT has been imp
7260: 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20  lemented by the 
7270: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29  pushOntoSorter()
7280: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
7290: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4c 69 6d   assert( p->iLim
72a0: 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54  it==0 );..  /* T
72b0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
72c0: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
72d0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
72e0: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
72f0: 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
7300: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7310: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
7320: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
7330: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
7340: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
7350: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
7360: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
7370: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
7380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7390: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
73a0: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
73b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
73c0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
73d0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
73e0: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
73f0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
7400: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
7410: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
7420: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
7430: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
7440: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
7450: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
7460: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
7470: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
7480: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
7490: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
74a0: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
74b0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
74c0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
74d0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
74e0: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
74f0: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
7500: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
7510: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
7520: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
7530: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
7540: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
7550: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
7560: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
7570: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
7580: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
7590: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
75a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
75b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
75c0: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
75d0: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
75e0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
75f0: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
7600: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
7610: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
7620: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
7630: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
7640: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
7650: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
7660: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
7670: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
7680: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
7690: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
76a0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
76b0: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
76c0: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  mn is NULL..*/.s
76d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
76e0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20   *columnType(.  
76f0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
7700: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
7710: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7720: 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63  *pzOriginDb,.  c
7730: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
7740: 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74  iginTab,.  const
7750: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
7760: 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  Col.){.  char co
7770: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
7780: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
7790: 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63  riginDb = 0;.  c
77a0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
77b0: 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  inTab = 0;.  cha
77c0: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
77d0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  Col = 0;.  int j
77e0: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  ;.  if( NEVER(pE
77f0: 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e  xpr==0) || pNC->
7800: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
7810: 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63  turn 0;..  switc
7820: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
7830: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
7840: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
7850: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
7860: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
7870: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
7880: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
7890: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
78a0: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
78b0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
78c0: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
78d0: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
78e0: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
78f0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
7900: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
7910: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
7920: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
7930: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
7940: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
7950: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
7960: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
7970: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
7980: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
7990: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
79a0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
79b0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
79c0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
79d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
79e0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
79f0: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
7a00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
7a10: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
7a20: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
7a30: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
7a40: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
7a50: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
7a60: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
7a70: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
7a80: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
7a90: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
7aa0: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
7ab0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
7ac0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
7ad0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
7ae0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
7af0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
7b00: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
7b10: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
7b20: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
7b30: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
7b40: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
7b50: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
7b60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
7b70: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
7b80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7b90: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
7ba0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
7bb0: 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c   /* At one time,
7bc0: 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53   code such as "S
7bd0: 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74  ELECT new.x" wit
7be0: 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f  hin a trigger wo
7bf0: 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  uld.        ** c
7c00: 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74  ause this condit
7c10: 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e  ion to run.  Sin
7c20: 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65  ce then, we have
7c30: 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f   restructured ho
7c40: 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69  w.        ** tri
7c50: 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e  gger code is gen
7c60: 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68  erated and so th
7c70: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
7c80: 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20  no longer .     
7c90: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
7ca0: 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  However, it can 
7cb0: 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f  still be true fo
7cc0: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b  r statements lik
7cd0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
7ce0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
7cf0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
7d00: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
7d10: 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29   t1(col INTEGER)
7d20: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ;.        **   S
7d30: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31  ELECT (SELECT t1
7d40: 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20  .col) FROM FROM 
7d50: 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  t1;.        **. 
7d60: 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63         ** when c
7d70: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
7d80: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
7d90: 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22  ression "t1.col"
7da0: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20   in the .       
7db0: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20   ** sub-select. 
7dc0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
7dd0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  t the column typ
7de0: 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a  e to NULL, even.
7df0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67          ** thoug
7e00: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c  h it should real
7e10: 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e  ly be "INTEGER".
7e20: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
7e30: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
7e40: 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73  ot a problem, as
7e50: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
7e60: 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20   of "t1.col" is 
7e70: 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  never.        **
7e80: 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75   used. When colu
7e90: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
7ea0: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
7eb0: 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  sion .        **
7ec0: 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c   "(SELECT t1.col
7ed0: 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  )", the correct 
7ee0: 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64  type is returned
7ef0: 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c   (see the TK_SEL
7f00: 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ECT.        ** b
7f10: 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f  ranch below.  */
7f20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7f30: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
7f40: 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70  ssert( pTab && p
7f50: 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62  Expr->pTab==pTab
7f60: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
7f80: 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63  he "table" is ac
7f90: 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c  tually a sub-sel
7fa0: 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e  ect or a view in
7fb0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7fc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
7fd0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
7fe0: 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ent. Return the 
7ff0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
8000: 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20   and origin.    
8010: 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20      ** data for 
8020: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63  the result-set c
8030: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62  olumn of the sub
8040: 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20  -select..       
8050: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
8060: 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59  iCol>=0 && ALWAY
8070: 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73  S(iCol<pS->pELis
8080: 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
8090: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
80a0: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
80b0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
80c0: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
80d0: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
80e0: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
80f0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
8100: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
8110: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
8120: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
8130: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
8140: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
8150: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
8160: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
8170: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
8180: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
8190: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
81a0: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
81b0: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
81c0: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
81d0: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
81e0: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
81f0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
8200: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
8210: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
8220: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
8230: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
8240: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
8250: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
8260: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
8270: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
8280: 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62   if( ALWAYS(pTab
8290: 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20 20  ->pSchema) ){.  
82a0: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
82b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
82c0: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
82d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
82e0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
82f0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
8300: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
8310: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
8320: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
8330: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
8340: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
8350: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
8360: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
8370: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22    zOriginCol = "
8380: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
8390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
83a0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
83b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
83c0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
83d0: 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  inCol = pTab->aC
83e0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
83f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8400: 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70    zOriginTab = p
8410: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
8420: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
8430: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
8440: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
8450: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
8460: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
8470: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
8480: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
8490: 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  inDb = pNC->pPar
84a0: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
84b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
84c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
84d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
84e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
84f0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
8500: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
8510: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
8520: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
8530: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
8540: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
8550: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
8560: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
8570: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
8580: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
8590: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
85a0: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
85b0: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
85c0: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
85d0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
85e0: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
85f0: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
8600: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
8610: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
8620: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
8630: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
8640: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
8650: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
8660: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
8670: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
8680: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
8690: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
86a0: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
86b0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
86c0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
86d0: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
86e0: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
86f0: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
8700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
8710: 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66  ndif.  }.  .  if
8720: 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a  ( pzOriginDb ){.
8730: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
8740: 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69  iginTab && pzOri
8750: 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  ginCol );.    *p
8760: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69  zOriginDb = zOri
8770: 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  ginDb;.    *pzOr
8780: 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69  iginTab = zOrigi
8790: 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  nTab;.    *pzOri
87a0: 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e  ginCol = zOrigin
87b0: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Col;.  }.  retur
87c0: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
87d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
87e0: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
87f0: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
8800: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
8810: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
8820: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
8830: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
8840: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
8850: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
8860: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
8870: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
8880: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
8890: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
88a0: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
88b0: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
88c0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
88d0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
88e0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e  t set */.){.#ifn
88f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8900: 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20  DECLTYPE.  Vdbe 
8910: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
8920: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  be;.  int i;.  N
8930: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
8940: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
8950: 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43   pTabList;.  sNC
8960: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
8970: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8980: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
8990: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
89a0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
89b0: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
89c0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66  char *zType;.#if
89d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
89e0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
89f0: 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  A.    const char
8a00: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
8a10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8a20: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20  OrigTab = 0;.   
8a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
8a40: 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a  igCol = 0;.    z
8a50: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
8a60: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
8a70: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
8a80: 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20  &zOrigCol);..   
8a90: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
8aa0: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
8ab0: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
8ac0: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
8ad0: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
8ae0: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
8af0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
8b00: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
8b10: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
8b20: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
8b30: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
8b40: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
8b50: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8b60: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
8b70: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
8b80: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
8b90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8ba0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8bb0: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
8bc0: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
8bd0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
8be0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8bf0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8c00: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
8c10: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
8c20: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
8c30: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
8c40: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
8c50: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
8c60: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
8c70: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8c80: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
8c90: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
8ca0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
8cb0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8cc0: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
8cd0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   */.}../*.** Gen
8ce0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
8cf0: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
8d00: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
8d10: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
8d20: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
8d30: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
8d40: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
8d50: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
8d60: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
8d70: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
8d80: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
8d90: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
8da0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8db0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
8dc0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
8dd0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
8de0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
8df0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8e00: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
8e10: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
8e20: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
8e30: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
8e40: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
8e50: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
8e60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8e70: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
8e80: 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74  fullNames, short
8e90: 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  Names;..#ifndef 
8ea0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
8eb0: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
8ec0: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
8ed0: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
8ee0: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
8ef0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
8f00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
8f10: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
8f20: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
8f30: 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64  NEVER(v==0) || d
8f40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8f50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
8f60: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
8f70: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
8f80: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
8f90: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
8fa0: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
8fb0: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
8fc0: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
8fd0: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
8fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
8ff0: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
9000: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
9010: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
9020: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9030: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
9040: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
9050: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  xpr;.    if( NEV
9060: 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69  ER(p==0) ) conti
9070: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
9080: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
9090: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
90a0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
90b0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
90c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
90d0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
90e0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
90f0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
9100: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
9110: 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( (p->op==TK_CO
9120: 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  LUMN || p->op==T
9130: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26  K_AGG_COLUMN) &&
9140: 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20   pTabList ){.   
9150: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
9160: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
9170: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
9180: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
9190: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c       for(j=0; AL
91a0: 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d  WAYS(j<pTabList-
91b0: 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20  >nSrc); j++){.  
91c0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69        if( pTabLi
91d0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
91e0: 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72  ==p->iTable ) br
91f0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9200: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
9210: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
9220: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
9230: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
9240: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
9250: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
9260: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
9270: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
9280: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
9290: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
92a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
92b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
92c0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
92d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
92e0: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
92f0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
9300: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9310: 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20  if( !shortNames 
9320: 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  && !fullNames ){
9330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9340: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
9350: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
9360: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
9370: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9380: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  db, pEList->a[i]
9390: 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f  .zSpan), SQLITE_
93a0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
93b0: 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61  }else if( fullNa
93c0: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63  mes ){.        c
93d0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
93e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
93f0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9400: 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
9410: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
9420: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9430: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9440: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
9450: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
9460: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
9470: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9480: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
9490: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
94a0: 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
94b0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
94c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
94d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
94e0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
94f0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
9500: 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  AME, .          
9510: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9520: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  db, pEList->a[i]
9530: 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f  .zSpan), SQLITE_
9540: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a  DYNAMIC);.    }.
9550: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
9560: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
9570: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
9580: 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  st);.}..#ifndef 
9590: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
95a0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
95b0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
95c0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
95d0: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
95e0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
95f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
9600: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
9610: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
9620: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
9630: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
9640: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
9650: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
9660: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9670: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
9680: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
9690: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
96a0: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
96b0: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
96c0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
96d0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
96e0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
96f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
9700: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
9710: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
9720: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
9730: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  /../*.** Given a
9740: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
9750: 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
9760: 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
9770: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
9780: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
9790: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
97a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
97b0: 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
97c0: 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
97d0: 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
97e0: 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
97f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
9800: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
9810: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
9820: 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
9830: 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
9840: 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
9850: 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
9860: 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
9870: 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
9880: 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
9890: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
98a0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
98b0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
98c0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
98d0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
98e0: 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
98f0: 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
9900: 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
9910: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
9920: 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63  NOMEM..*/.static
9930: 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d   int selectColum
9940: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  nsFromExprList(.
9950: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
9970: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9980: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
9990: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70  st,       /* Exp
99a0: 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63  r list from whic
99b0: 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75  h to derive colu
99c0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  mn names */.  in
99d0: 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20  t *pnCol,       
99e0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
99f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
9a00: 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43  umns here */.  C
9a10: 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20  olumn **paCol   
9a20: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
9a30: 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c  the new column l
9a40: 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ist here */.){. 
9a50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9a60: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
9a70: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
9a80: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ion */.  int i, 
9a90: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
9aa0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9ab0: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
9ac0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
9ad0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9ae0: 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  added to make th
9af0: 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f  e name unique */
9b00: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
9b10: 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f   *pCol;        /
9b20: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
9b30: 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  er result column
9b40: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  s */.  int nCol;
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9b70: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
9b80: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45  esult set */.  E
9b90: 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  xpr *p;         
9ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
9bb0: 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73  pression for a s
9bc0: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c  ingle result col
9bd0: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  umn */.  char *z
9be0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
9bf0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
9c00: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ame */.  int nNa
9c10: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
9c20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9c30: 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20  name in zName[] 
9c40: 2a 2f 0a 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e  */..  *pnCol = n
9c50: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
9c60: 78 70 72 3b 0a 20 20 61 43 6f 6c 20 3d 20 2a 70  xpr;.  aCol = *p
9c70: 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  aCol = sqlite3Db
9c80: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
9c90: 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e  izeof(aCol[0])*n
9ca0: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 61 43 6f 6c  Col);.  if( aCol
9cb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
9cc0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f 72  ITE_NOMEM;.  for
9cd0: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
9ce0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43   i<nCol; i++, pC
9cf0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65  ol++){.    /* Ge
9d00: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
9d10: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
9d20: 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
9d30: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
9d40: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
9d50: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
9d60: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
9d70: 72 74 79 28 70 2d 3e 70 52 69 67 68 74 2c 20 45  rty(p->pRight, E
9d80: 50 5f 49 6e 74 56 61 6c 75 65 29 0a 20 20 20 20  P_IntValue).    
9d90: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
9da0: 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65  >pRight->u.zToke
9db0: 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  n==0 || p->pRigh
9dc0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d  t->u.zToken[0]!=
9dd0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  0 );.    if( (zN
9de0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
9df0: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
9e00: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
9e10: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
9e20: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
9e30: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
9e40: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
9e50: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
9e60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
9e70: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
9e80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
9e90: 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20   *pColExpr = p; 
9ea0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
9eb0: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72  on that is the r
9ec0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
9ed0: 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
9ee0: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
9ef0: 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61  /* Table associa
9f00: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78  ted with this ex
9f10: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
9f20: 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
9f30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 20  r->op==TK_DOT ) 
9f40: 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45  pColExpr = pColE
9f50: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
9f60: 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
9f70: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
9f80: 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70  & ALWAYS(pColExp
9f90: 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  r->pTab!=0) ){. 
9fa0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
9fb0: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
9fc0: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
9fd0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
9fe0: 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
9ff0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
a000: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
a010: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
a020: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
a030: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
a040: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a050: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
a060: 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20  b, "%s",.       
a070: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d            iCol>=
a080: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
a090: 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f  Col].zName : "ro
a0a0: 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wid");.      }el
a0b0: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
a0c0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
a0d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
a0e0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a0f0: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
a100: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
a110: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
a120: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
a130: 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  , pColExpr->u.zT
a140: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
a150: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  se{.        /* U
a160: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
a170: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
a180: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
a190: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
a1a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
a1b0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
a1c0: 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  "%s", pEList->a[
a1d0: 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  i].zSpan);.     
a1e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
a1f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a200: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
a210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
a220: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
a230: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a240: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
a250: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
a260: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
a270: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
a280: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
a290: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
a2a0: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
a2b0: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
a2c0: 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65      */.    nName
a2d0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a2e0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  30(zName);.    f
a2f0: 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b  or(j=cnt=0; j<i;
a300: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
a310: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a320: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[j].zName, z
a330: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
a340: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61      char *zNewNa
a350: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  me;.        zNam
a360: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
a370: 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d        zNewName =
a380: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
a390: 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61  db, "%s:%d", zNa
a3a0: 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
a3b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a3c0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
a3d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e        zName = zN
a3e0: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
a3f0: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  j = -1;.        
a400: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62  if( zName==0 ) b
a410: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a420: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
a430: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d  ame = zName;.  }
a440: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
a450: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
a460: 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  or(j=0; j<i; j++
a470: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a480: 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b  DbFree(db, aCol[
a490: 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  j].zName);.    }
a4a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
a4b0: 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20  ee(db, aCol);.  
a4c0: 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20    *paCol = 0;.  
a4d0: 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20    *pnCol = 0;.  
a4e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4f0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
a500: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a510: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65  ../*.** Add type
a520: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
a530: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20  nformation to a 
a540: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65  column list base
a550: 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54  d on.** a SELECT
a560: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a   statement..** .
a570: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
a580: 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61  st presumably ca
a590: 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f  me from selectCo
a5a0: 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70  lumnNamesFromExp
a5b0: 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20  rList()..** The 
a5c0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20  column list has 
a5d0: 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20  only names, not 
a5e0: 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69  types or collati
a5f0: 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ons.  This.** ro
a600: 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75  utine goes throu
a610: 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20  gh and adds the 
a620: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
a630: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
a640: 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65   routine require
a650: 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74  s that all ident
a660: 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45  ifiers in the SE
a670: 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
a680: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  t be resolved..*
a690: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
a6a0: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
a6b0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eAndCollation(. 
a6c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a6d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
a6e0: 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20  g contexts */.  
a6f0: 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  int nCol,       
a700: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a710: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
a720: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20  Column *aCol,   
a730: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
a740: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65   columns */.  Se
a750: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
a760: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
a770: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a780: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
a790: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
a7a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a7b0: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
a7c0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
a7d0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
a7e0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
a7f0: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
a800: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a810: 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73  t_item *a;..  as
a820: 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
a830: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
a840: 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
a850: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
a860: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a870: 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70  nCol==pSelect->p
a880: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20  EList->nExpr || 
a890: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a8a0: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
a8b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
a8c0: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  urn;.  memset(&s
a8d0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
a8e0: 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  C));.  sNC.pSrcL
a8f0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
a900: 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65  Src;.  a = pSele
a910: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  ct->pEList->a;. 
a920: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
a930: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  Col; i<nCol; i++
a940: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
a950: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
a960: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
a970: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
a980: 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28  (db, columnType(
a990: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
a9a0: 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  ));.    pCol->af
a9b0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
a9c0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
a9d0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
a9e0: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
a9f0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
aa00: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
aa10: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
aa20: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
aa30: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
aa40: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
aa50: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
aa60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
aa70: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  b, pColl->zName)
aa80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
aa90: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
aaa0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
aab0: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
aac0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
aad0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
aae0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
aaf0: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
ab00: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
ab10: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
ab20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
ab30: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
ab40: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
ab50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ab60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
ab70: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
ab80: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
ab90: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
aba0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
abb0: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
abc0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
abd0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
abe0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
abf0: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
ac00: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
ac10: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
ac20: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
ac30: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
ac40: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
ac50: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
ac60: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
ac70: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
ac80: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ac90: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
aca0: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
acb0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
acc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
acd0: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  /* The sqlite3Re
ace0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
acf0: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e  ) is only used n
ad00: 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20   contexts where 
ad10: 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69  lookaside.  ** i
ad20: 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
ad30: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
ad40: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d  aside.bEnabled==
ad50: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65  0 );.  pTab->nRe
ad60: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
ad70: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73 65 6c 65  Name = 0;.  sele
ad80: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
ad90: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
ada0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26  elect->pEList, &
adb0: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
adc0: 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65  b->aCol);.  sele
add0: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
ade0: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
adf0: 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  se, pTab->nCol, 
ae00: 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c  pTab->aCol, pSel
ae10: 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
ae20: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
ae30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ae40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
ae50: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
ae60: 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
ae70: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
ae80: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
ae90: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
aea0: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
aeb0: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
aec0: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
aed0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
aee0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
aef0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
af00: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
af10: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
af20: 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
af30: 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
af40: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
af50: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
af60: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
af70: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
af80: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
af90: 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62  reate(pParse->db
afa0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
afb0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
afc0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20   if( v ){.      
afd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
afe0: 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a  0(v, OP_Trace);.
aff0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
b000: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
b010: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
b020: 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
b030: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
b040: 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
b050: 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
b060: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78  t and pOffset ex
b070: 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d  pressions.  pLim
b080: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68  it and pOffset h
b090: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
b0a0: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
b0b0: 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
b0c0: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
b0d0: 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
b0e0: 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
b0f0: 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
b100: 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
b110: 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
b120: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
b130: 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
b140: 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
b150: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
b160: 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
b170: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
b180: 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
b190: 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
b1a0: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
b1b0: 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
b1c0: 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
b1d0: 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
b1e0: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
b1f0: 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
b200: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69   the values of i
b210: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
b220: 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
b230: 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
b240: 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69  s defined by pLi
b250: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e  mit and pOffset.
b260: 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20    iLimit and.** 
b270: 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
b280: 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
b290: 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
b2a0: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a  efault values.**
b2b0: 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f   (usually but no
b2c0: 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69  t always -1) pri
b2d0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
b2e0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f  is routine..** O
b2f0: 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30  nly if pLimit!=0
b300: 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64   or pOffset!=0 d
b310: 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  o the limit regi
b320: 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64  sters get.** red
b330: 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49  efined.  The UNI
b340: 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
b350: 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72  uses this proper
b360: 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74  ty to force.** t
b370: 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20  he reuse of the 
b380: 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f  same limit and o
b390: 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20  ffset registers 
b3a0: 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a  across multiple.
b3b0: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
b3c0: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
b3d0: 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69  void computeLimi
b3e0: 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65  tRegisters(Parse
b3f0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
b400: 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29   *p, int iBreak)
b410: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b  {.  Vdbe *v = 0;
b420: 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20  .  int iLimit = 
b430: 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74  0;.  int iOffset
b440: 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e  ;.  int addr1, n
b450: 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
b460: 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  t ) return;..  /
b470: 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
b480: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
b490: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
b4a0: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
b4b0: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
b4c0: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
b4d0: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
b4e0: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
b4f0: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
b500: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
b510: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
b520: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
b530: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
b540: 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
b550: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
b560: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  p->pOffset==0 ||
b570: 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b   p->pLimit!=0 );
b580: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
b590: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   ){.    p->iLimi
b5a0: 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
b5b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
b5c0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
b5d0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
b5e0: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
b5f0: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 56   ) return;  /* V
b600: 44 42 45 20 73 68 6f 75 6c 64 20 68 61 76 65 20  DBE should have 
b610: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
b620: 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66  ocated */.    if
b630: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
b640: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74  nteger(p->pLimit
b650: 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  , &n) ){.      s
b660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b670: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b680: 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  n, iLimit);.    
b690: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
b6a0: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
b6b0: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  "));.      if( n
b6c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
b6d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b6e0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
b6f0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
b700: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b710: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b720: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
b730: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
b740: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b750: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
b760: 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  BeInt, iLimit);.
b770: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
b780: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
b790: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
b7a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b7b0: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69  (v, OP_IfZero, i
b7c0: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a  Limit, iBreak);.
b7d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
b7e0: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
b7f0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
b800: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
b810: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
b820: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
b830: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
b840: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
b850: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
b860: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
b870: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b880: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
b890: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
b8a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
b8b0: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
b8c0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
b8d0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b8e0: 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
b8f0: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
b900: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b910: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
b920: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
b930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b940: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
b950: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
b960: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b970: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
b980: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
b990: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b9a0: 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69  P_Add, iLimit, i
b9b0: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b  Offset, iOffset+
b9c0: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
b9d0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
b9e0: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
b9f0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
ba00: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
ba10: 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29  P_IfPos, iLimit)
ba20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ba30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ba40: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66  Integer, -1, iOf
ba50: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73  fset+1);.      s
ba60: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ba70: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
ba80: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
ba90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
baa0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
bab0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
bac0: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
bad0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
bae0: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
baf0: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
bb00: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
bb10: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
bb20: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
bb30: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
bb40: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
bb50: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
bb60: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
bb70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
bb80: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
bb90: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
bba0: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
bbb0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
bbc0: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
bbd0: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
bbe0: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
bbf0: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
bc00: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
bc10: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
bc20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
bc30: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
bc40: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
bc50: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
bc60: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
bc70: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
bc80: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
bc90: 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
bca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
bcb0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  t = 0;.  }.  ass
bcc0: 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a  ert( iCol>=0 );.
bcd0: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
bce0: 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d   iCol<p->pEList-
bcf0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52  >nExpr ){.    pR
bd00: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
bd10: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
bd20: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
bd30: 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
bd40: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
bd50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bd60: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
bd70: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  ELECT */../* For
bd80: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
bd90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
bda0: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
bdb0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bdc0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
bdd0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
bde0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
bdf0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
be00: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
be10: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
be20: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
be30: 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
be40: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
be50: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
be60: 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;...#ifndef SQLI
be70: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
be80: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68  _SELECT./*.** Th
be90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
bea0: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
beb0: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
bec0: 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77   form from.** tw
bed0: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
bee0: 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67  te queries using
bef0: 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c   UNION, UNION AL
bf00: 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a  L, EXCEPT, or.**
bf10: 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a   INTERSECT.**.**
bf20: 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
bf30: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
bf40: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
bf50: 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
bf60: 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
bf70: 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
bf80: 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
bf90: 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
bfa0: 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
bfb0: 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
bfc0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
bfd0: 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
bfe0: 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
bff0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
c000: 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
c010: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
c020: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
c030: 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
c040: 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
c050: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
c060: 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
c070: 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
c080: 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
c090: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
c0a0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
c0b0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
c0c0: 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
c0d0: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
c0e0: 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
c0f0: 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
c100: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
c110: 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
c120: 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
c130: 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
c140: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
c150: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
c160: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
c170: 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
c180: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
c190: 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
c1a0: 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
c1b0: 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
c1c0: 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
c1d0: 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
c1e0: 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
c1f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
c200: 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
c210: 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
c220: 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
c230: 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
c240: 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
c250: 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
c260: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
c270: 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
c280: 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
c290: 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
c2a0: 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
c2b0: 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
c2c0: 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
c2d0: 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
c2e0: 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
c2f0: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
c300: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c310: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
c320: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c330: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
c340: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
c350: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
c360: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
c370: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
c380: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
c390: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
c3a0: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
c3b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
c3c0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
c3d0: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
c3e0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
c3f0: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
c400: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
c410: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
c420: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
c430: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c450: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
c460: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
c470: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
c480: 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
c490: 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e  tive data destin
c4a0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ation */.  Selec
c4b0: 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
c4c0: 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d   /* Chain of sim
c4d0: 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64  ple selects to d
c4e0: 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  elete */.  sqlit
c4f0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
c500: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
c510: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  nection */..  /*
c520: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
c530: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
c540: 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
c550: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
c560: 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
c570: 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
c580: 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
c590: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
c5a0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
c5b0: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73  LIMIT..  */.  as
c5c0: 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50  sert( p && p->pP
c5d0: 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c  rior );  /* Call
c5e0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61  ing function gua
c5f0: 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63  rantees this muc
c600: 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  h */.  db = pPar
c610: 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72  se->db;.  pPrior
c620: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
c630: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
c640: 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69  pRightmost!=pPri
c650: 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
c660: 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
c670: 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73  st==p->pRightmos
c680: 74 20 29 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  t );.  dest = *p
c690: 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
c6a0: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
c6b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c6c0: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
c6d0: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
c6e0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
c6f0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
c700: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
c710: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
c720: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
c730: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c740: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
c750: 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
c760: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c770: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
c780: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
c790: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
c7a0: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
c7b0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
c7c0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
c7d0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
c7e0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
c7f0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
c800: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c810: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
c820: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
c830: 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
c840: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
c850: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
c860: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
c870: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c880: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
c890: 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
c8a0: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
c8b0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
c8c0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
c8d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c8e0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
c8f0: 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 50  hemeral, dest.iP
c900: 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
c910: 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
c920: 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
c930: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  le;.  }..  /* Ma
c940: 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
c950: 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
c960: 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
c970: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
c980: 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
c990: 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
c9a0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c9b0: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
c9c0: 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
c9d0: 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
c9e0: 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
c9f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
ca00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ca10: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
ca20: 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
ca30: 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
ca40: 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74  ".      " do not
ca50: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
ca60: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
ca70: 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74  columns", select
ca80: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
ca90: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
caa0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
cab0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
cac0: 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
cad0: 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
cae0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
caf0: 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
cb00: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
cb10: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
cb20: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
cb30: 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
cb40: 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
cb50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
cb60: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
cb70: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
cb80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cb90: 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
cba0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
cbb0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
cbc0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
cbd0: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
cbe0: 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
cbf0: 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
cc00: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
cc10: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
cc20: 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
cc30: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
cc40: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
cc50: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
cc60: 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
cc70: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
cc80: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
cc90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
cca0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
ccb0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
ccc0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
ccd0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
cce0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
ccf0: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
cd00: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  it;.      p->iOf
cd10: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
cd20: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
cd30: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
cd40: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
cd50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
cd60: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
cd70: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
cd80: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
cd90: 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66  , "Jump ahead if
cda0: 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
cdb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
cdc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
cdd0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
cde0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
cdf0: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
ce00: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
ce10: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
ce20: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
ce30: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
ce40: 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
ce50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ce60: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
ce70: 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dr);.      }.   
ce80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ce90: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
cea0: 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
ceb0: 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
cec0: 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
ced0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
cee0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
cef0: 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
cf00: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
cf10: 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  u8 op = 0;      
cf20: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
cf30: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
cf40: 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
cf50: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
cf60: 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
cf70: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
cf80: 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
cf90: 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
cfa0: 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
cfb0: 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61   *pOffset; /* Sa
cfc0: 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d  ved values of p-
cfd0: 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e  >nLimit and p->n
cfe0: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  Offset */.      
cff0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
d000: 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e  SelectDest union
d010: 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73  dest;..      tes
d020: 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
d030: 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20  _EXCEPT );.     
d040: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
d050: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
d060: 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
d070: 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
d080: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
d090: 72 69 6f 72 4f 70 20 26 26 20 41 4c 57 41 59 53  riorOp && ALWAYS
d0a0: 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70  (!p->pLimit &&!p
d0b0: 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20  ->pOffset) ){.  
d0c0: 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
d0d0: 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
d0e0: 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
d0f0: 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
d100: 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   our.        ** 
d110: 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a  right..        *
d120: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
d130: 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21  ( p->pRightmost!
d140: 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e  =p );  /* Can on
d150: 6c 79 20 68 61 70 70 65 6e 20 66 6f 72 20 6c 65  ly happen for le
d160: 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a  ftward elements.
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d190: 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77       ** of a 3-w
d1a0: 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f  ay or more compo
d1b0: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  und */.        a
d1c0: 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
d1d0: 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
d1e0: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
d1f0: 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
d200: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
d210: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
d220: 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61   );     /* Not a
d230: 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
d240: 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
d250: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
d260: 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20  = dest.iParm;.  
d270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d280: 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
d290: 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
d2a0: 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
d2b0: 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
d2c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
d2d0: 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
d2e0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
d2f0: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
d300: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
d310: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d320: 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
d330: 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  ;.        addr =
d340: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d350: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
d360: 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62  emeral, unionTab
d370: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73  , 0);.        as
d380: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
d390: 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
d3a0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64  ;.        p->add
d3b0: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
d3c0: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ddr;.        p->
d3d0: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46  pRightmost->selF
d3e0: 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
d3f0: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
d400: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d410: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ist );.      }..
d420: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
d430: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
d440: 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a  nts to our left.
d450: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
d460: 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
d470: 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  pOrderBy );.    
d480: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d490: 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65  estInit(&unionde
d4a0: 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69  st, priorOp, uni
d4b0: 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 72 63  onTab);.      rc
d4c0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d4d0: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
d4e0: 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
d4f0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d500: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
d510: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
d520: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
d530: 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
d540: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d550: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d560: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
d570: 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
d580: 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
d590: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d5a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d5b0: 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
d5c0: 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
d5d0: 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d  T_Union;.      }
d5e0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
d5f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
d600: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
d610: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
d620: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
d630: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
d640: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
d650: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69  t = 0;.      uni
d660: 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f  ondest.eDest = o
d670: 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  p;.      rc = sq
d680: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
d690: 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
d6a0: 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
d6b0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
d6c0: 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  K );.      /* Qu
d6d0: 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
d6e0: 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
d6f0: 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
d700: 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
d710: 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
d720: 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
d730: 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
d740: 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
d750: 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
d760: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d770: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
d780: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44  derBy);.      pD
d790: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
d7a0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
d7b0: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
d7c0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
d7d0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
d7e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
d7f0: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
d800: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
d810: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
d820: 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
d830: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
d840: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
d850: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  iOffset = 0;..  
d860: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
d870: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
d880: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
d890: 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
d8a0: 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
d8b0: 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
d8c0: 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
d8d0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
d8e0: 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69  unionTab==dest.i
d8f0: 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
d900: 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
d910: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
d920: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est!=priorOp ){.
d930: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
d940: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
d950: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
d960: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
d970: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74          if( dest
d980: 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  .eDest==SRT_Outp
d990: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
d9a0: 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
d9b0: 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   p;.          wh
d9c0: 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
d9d0: 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
d9e0: 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
d9f0: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
da00: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
da10: 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
da20: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
da30: 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61   }.        iBrea
da40: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
da50: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
da60: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
da70: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
da80: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  l(v);.        co
da90: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
daa0: 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
dab0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
dac0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dad0: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
dae0: 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
daf0: 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
db00: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
db10: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
db20: 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
db30: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
db40: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
db50: 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
db60: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db80: 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69   0, -1, &dest, i
db90: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
dba0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dbb0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
dbc0: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
dbd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dbe0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
dbf0: 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
dc00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
dc10: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
dc20: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
dc30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dc40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
dc50: 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  lose, unionTab, 
dc60: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
dc70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
dc80: 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
dc90: 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  rt( p->op==TK_IN
dca0: 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20  TERSECT ); {.   
dcb0: 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
dcc0: 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  2;.      int iCo
dcd0: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
dce0: 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  rt;.      Expr *
dcf0: 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
dd00: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
dd10: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  ;.      SelectDe
dd20: 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74  st intersectdest
dd30: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  ;.      int r1;.
dd40: 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53  .      /* INTERS
dd50: 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
dd60: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
dd70: 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
dd80: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20  es.      ** two 
dd90: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
dda0: 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20  .  Hence it has 
ddb0: 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42  its own case.  B
ddc0: 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  egin.      ** by
ddd0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
dde0: 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
ddf0: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
de00: 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73      tab1 = pPars
de10: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
de20: 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e   tab2 = pParse->
de30: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73  nTab++;.      as
de40: 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
de50: 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61  y==0 );..      a
de60: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
de70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
de80: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
de90: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  1, 0);.      ass
dea0: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
deb0: 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
dec0: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
ded0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
dee0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68  ;.      p->pRigh
def0: 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20  tmost->selFlags 
df00: 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
df10: 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ral;.      asser
df20: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
df30: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
df40: 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
df50: 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
df60: 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
df70: 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
df80: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
df90: 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73  DestInit(&inters
dfa0: 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69  ectdest, SRT_Uni
dfb0: 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20  on, tab1);.     
dfc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
dfd0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
dfe0: 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
dff0: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
e000: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
e010: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
e020: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
e030: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
e040: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
e050: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
e060: 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
e070: 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
e080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e090: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
e0a0: 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
e0b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e0c0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
e0d0: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
e0e0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
e0f0: 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
e100: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
e110: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
e120: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
e130: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
e140: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
e150: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
e160: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
e170: 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
e180: 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61  tdest.iParm = ta
e190: 62 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  b2;.      rc = s
e1a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
e1b0: 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
e1c0: 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ctdest);.      t
e1d0: 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
e1e0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
e1f0: 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
e200: 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
e210: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
e220: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e230: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
e240: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
e250: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
e260: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
e270: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20  t = pOffset;..  
e280: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
e290: 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
e2a0: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
e2b0: 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
e2c0: 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
e2d0: 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
e2e0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
e2f0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
e300: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
e310: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
e320: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
e330: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
e340: 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
e350: 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
e360: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
e370: 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
e380: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
e390: 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
e3a0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
e3b0: 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
e3c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
e3d0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
e3e0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
e3f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
e400: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
e410: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
e420: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
e430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e440: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
e450: 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
e460: 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  ak);.      r1 = 
e470: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
e480: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
e490: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
e4a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e4b0: 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
e4c0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
e4d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
e4e0: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
e4f0: 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
e500: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
e510: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
e520: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
e530: 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
e540: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
e550: 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
e560: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
e570: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e580: 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26          0, -1, &
e590: 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
e5a0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
e5b0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
e5c0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
e5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e5e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
e5f0: 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
e600: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e610: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
e620: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
e630: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e640: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
e650: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
e660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e670: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
e680: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
e690: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
e6a0: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
e6b0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
e6c0: 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  es used by .  **
e6d0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e6e0: 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
e6f0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
e700: 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
e710: 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
e720: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
e730: 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
e740: 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
e750: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20  This section is 
e760: 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74  run by the right
e770: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
e780: 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a  tement only..  *
e790: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
e7a0: 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  nts to the left 
e7b0: 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73  always skip this
e7c0: 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68   part.  The righ
e7d0: 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45  t-most.  ** SELE
e7e0: 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b  CT might also sk
e7f0: 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20  ip this part if 
e800: 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20  it has no ORDER 
e810: 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20  BY clause and.  
e820: 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65  ** no temp table
e830: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a  s are required..
e840: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
e850: 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73  lFlags & SF_Uses
e860: 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20  Ephemeral ){.   
e870: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e890: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e8a0: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
e8b0: 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
e8c0: 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
e8d0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
e8e0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
e8f0: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
e900: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
e910: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
e920: 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
e930: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
e940: 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
e950: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
e960: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
e970: 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
e980: 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
e990: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
e9c0: 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
e9d0: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
e9e0: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
e9f0: 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  p );.    nCol = 
ea00: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
ea10: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
ea20: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ea30: 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
ea60: 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43  )+nCol*(sizeof(C
ea70: 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a  ollSeq*) + 1));.
ea80: 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
ea90: 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
eaa0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
eab0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
eac0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
ead0: 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ..    pKeyInfo->
eae0: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
eaf0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
eb00: 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b  eld = (u16)nCol;
eb10: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  ..    for(i=0, a
eb20: 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
eb30: 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
eb40: 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
eb50: 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
eb60: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
eb70: 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
eb80: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
eb90: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
eba0: 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   *apColl = db->p
ebb0: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
ebc0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
ebd0: 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
ebe0: 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
ebf0: 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72  rior){.      for
ec00: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
ec10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
ec20: 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  r = pLoop->addrO
ec30: 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20  penEphm[i];.    
ec40: 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29      if( addr<0 )
ec50: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
ec60: 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20  f [0] is unused 
ec70: 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f  then [1] is also
ec80: 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20   unused.  So we 
ec90: 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  can.          **
eca0: 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61   always safely a
ecb0: 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20  bort as soon as 
ecc0: 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64  the first unused
ecd0: 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a   slot is found *
ece0: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
ecf0: 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  rt( pLoop->addrO
ed00: 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a  penEphm[1]<0 );.
ed10: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ed20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ed30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ed40: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
ed50: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
ed60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ed70: 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P4(v, addr, (cha
ed80: 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
ed90: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
eda0: 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
edb0: 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
edc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
edd0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ede0: 62 2c 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  b, pKeyInfo);.  
edf0: 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
ee00: 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d  end:.  pDest->iM
ee10: 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a  em = dest.iMem;.
ee20: 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20    pDest->nMem = 
ee30: 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  dest.nMem;.  sql
ee40: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
ee50: 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20  (db, pDelete);. 
ee60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
ee70: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ee80: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
ee90: 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ECT */../*.** Co
eea0: 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
eeb0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
eec0: 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
eed0: 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
eee0: 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
eef0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
ef00: 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
ef10: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
ef20: 3e 69 4d 65 6d 2e 20 20 54 68 65 72 65 20 61 72  >iMem.  There ar
ef30: 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63  e.** pIn->nMem c
ef40: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74  olumns to be out
ef50: 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77  put.  pDest is w
ef60: 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20  here the output 
ef70: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e  should.** be sen
ef80: 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75  t..**.** regRetu
ef90: 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  rn is the number
efa0: 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72   of the register
efb0: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62   holding the sub
efc0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
efd0: 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  n address..**.**
efe0: 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
eff0: 65 6e 20 69 74 20 69 73 20 61 20 74 68 65 20 66  en it is a the f
f000: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
f010: 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
f020: 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
f030: 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
f040: 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
f050: 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
f060: 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
f070: 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
f080: 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
f090: 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
f0a0: 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
f0b0: 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
f0c0: 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
f0d0: 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
f0e0: 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
f0f0: 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
f100: 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
f110: 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
f120: 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
f130: 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
f140: 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
f150: 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
f160: 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
f170: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
f190: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
f1a0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
f1b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f1c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f1d0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
f1e0: 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
f1f0: 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
f200: 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
f210: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
f220: 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
f230: 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
f240: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
f250: 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
f260: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
f270: 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
f280: 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
f290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
f2a0: 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
f2b0: 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
f2c0: 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
f2d0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
f2e0: 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
f2f0: 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
f300: 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
f310: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 2c 20 20  .  int p4type,  
f320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f330: 65 20 70 34 20 74 79 70 65 20 66 6f 72 20 70 4b  e p4 type for pK
f340: 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20  eyInfo */.  int 
f350: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
f360: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
f370: 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
f380: 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
f390: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
f3a0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
f3b0: 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
f3c0: 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
f3d0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
f3e0: 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
f3f0: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
f400: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
f410: 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
f420: 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
f430: 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
f440: 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
f450: 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
f460: 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b  .    int j1, j2;
f470: 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
f480: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f490: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
f4a0: 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  );.    j2 = sqli
f4b0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
f4c0: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
f4d0: 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b  ->iMem, regPrev+
f4e0: 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20  1, pIn->nMem,.  
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
f510: 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74  r*)pKeyInfo, p4t
f520: 79 70 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ype);.    sqlite
f530: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f540: 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43  P_Jump, j2+2, iC
f550: 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a  ontinue, j2+2);.
f560: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
f570: 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
f580: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
f590: 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20  odeCopy(pParse, 
f5a0: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72  pIn->iMem, regPr
f5b0: 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  ev+1, pIn->nMem)
f5c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f5d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
f5e0: 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65  teger, 1, regPre
f5f0: 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
f600: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
f610: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
f620: 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  0;..  /* Suppres
f630: 73 20 74 68 65 20 74 68 65 20 66 69 72 73 74 20  s the the first 
f640: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69  OFFSET entries i
f650: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46  f there is an OF
f660: 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FSET clause.  */
f670: 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
f680: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   p, iContinue);.
f690: 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74  .  switch( pDest
f6a0: 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ->eDest ){.    /
f6b0: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
f6c0: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
f6d0: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
f6e0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
f6f0: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
f700: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
f710: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
f720: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
f730: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
f740: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
f750: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
f760: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73  arse);.      tes
f770: 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
f780: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
f790: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f7a0: 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
f7b0: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
f7c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f7d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
f7e0: 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
f7f0: 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20  Mem, pIn->nMem, 
f800: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
f810: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f820: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65  OP_NewRowid, pDe
f830: 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b 0a  st->iParm, r2);.
f840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f850: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
f860: 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61  sert, pDest->iPa
f870: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
f880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f890: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
f8a0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
f8b0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f8c0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
f8d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f8e0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
f8f0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
f900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
f910: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f920: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
f930: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
f940: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
f950: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
f960: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
f970: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
f980: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
f990: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
f9a0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
f9b0: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
f9c0: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
f9d0: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
f9e0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
f9f0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
fa00: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
fa10: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
fa20: 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b   pIn->nMem==1 );
fa30: 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69  .      p->affini
fa40: 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73  ty = .         s
fa50: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
fa60: 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d  inity(p->pEList-
fa70: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
fa80: 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20  st->affinity);. 
fa90: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
faa0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
fab0: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
fac0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
fad0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
fae0: 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31 2c  In->iMem, 1, r1,
faf0: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
fb00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fb10: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
fb20: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
fb30: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  pIn->iMem, 1);. 
fb40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fb50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
fb60: 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
fb70: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
fb80: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
fb90: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
fba0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
fbb0: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f  .    }..#if 0  /
fbc0: 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f  * Never occurs o
fbd0: 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75  n an ORDER BY qu
fbe0: 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  ery */.    /* If
fbf0: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
fc00: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
fc10: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
fc20: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
fc30: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
fc40: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
fc50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fc60: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
fc70: 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 50 61  r, 1, pDest->iPa
fc80: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
fc90: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
fca0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
fcb0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
fcc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fcd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
fce0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
fcf0: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
fd00: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
fd10: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
fd20: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
fd30: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
fd40: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
fd50: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
fd60: 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
fd70: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
fd80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
fd90: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
fda0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
fdb0: 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Mem==1 );.      
fdc0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
fdd0: 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
fde0: 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50  >iMem, pDest->iP
fdf0: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
fe00: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
fe10: 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
fe20: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
fe30: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
fe40: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
fe50: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
fe60: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
fe70: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
fe80: 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
fe90: 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
fea0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
feb0: 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
fec0: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20 54   pDest->iMem.  T
fed0: 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  hen the co-routi
fee0: 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a  ne yields..    *
fef0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
ff00: 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
ff10: 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65    if( pDest->iMe
ff20: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
ff30: 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71  pDest->iMem = sq
ff40: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
ff50: 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
ff60: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44  Mem);.        pD
ff70: 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d  est->nMem = pIn-
ff80: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >nMem;.      }. 
ff90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ffa0: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
ffb0: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73   pIn->iMem, pDes
ffc0: 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  t->iMem, pDest->
ffd0: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  nMem);.      sql
ffe0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fff0: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
10000 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t->iParm);.     
10010 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
10020 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
10030 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
10040 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
10050 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
10060 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
10070 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
10080 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
10090 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
100a0 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
100b0 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
100c0 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
100d0 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
100e0 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
100f0 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
10100 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
10110 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
10120 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
10130 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
10140 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
10150 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
10160 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
10170 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
10180 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
10190 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
101a0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
101b0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
101c0 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
101d0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
101e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
101f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
10200 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d  sultRow, pIn->iM
10210 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  em, pIn->nMem);.
10220 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10230 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
10240 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
10250 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65  ->iMem, pIn->nMe
10260 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
10270 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10280 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
10290 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
102a0 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
102b0 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ched..  */.  if(
102c0 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
102d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
102e0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op3(v, OP_IfZero
102f0 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
10300 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20  eak, -1);.  }.. 
10310 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
10320 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
10330 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
10340 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
10350 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
10360 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10370 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
10380 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  n, regReturn);..
10390 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
103a0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74  ../*.** Alternat
103b0 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  ive compound sel
103c0 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ect code generat
103d0 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  or for cases whe
103e0 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e  n there.** is an
103f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
10400 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
10410 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  e a query of the
10420 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a   following form:
10430 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c  .**.**      <sel
10440 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72  ectA>  <operator
10450 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52  >  <selectB>  OR
10460 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c  DER BY <orderbyl
10470 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72  ist>.**.** <oper
10480 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20  ator> is one of 
10490 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e  UNION ALL, UNION
104a0 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
104b0 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65  ERSECT.  The ide
104c0 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20  a.** is to code 
104d0 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61  both <selectA> a
104e0 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74  nd <selectB> wit
104f0 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
10500 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72  lause as.** co-r
10510 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72  outines.  Then r
10520 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  un the co-routin
10530 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61  es in parallel a
10540 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73  nd merge the res
10550 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ults.** into the
10560 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64   output.  In add
10570 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f  ition to the two
10580 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c   coroutines (cal
10590 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a  led selectA and.
105a0 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72  ** selectB) ther
105b0 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69  e are 7 subrouti
105c0 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  nes:.**.**    ou
105d0 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tA:    Move the 
105e0 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
105f0 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20  lectA coroutine 
10600 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
10610 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
10620 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
10630 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  uery..**.**    o
10640 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utB:    Move the
10650 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
10660 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65  electB coroutine
10670 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
10680 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10690 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
106a0 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65  query.  (Only ge
106b0 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f  nerated for UNIO
106c0 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  N and.**        
106d0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20       UNION ALL. 
106e0 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45   EXCEPT and INSE
106f0 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74  RTSECT never out
10700 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a  put a row that.*
10710 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70  *             ap
10720 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e  pears only in B.
10730 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a  ).**.**    AltB:
10740 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
10750 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
10760 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
10770 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a  es and A<B..**.*
10780 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61  *    AeqB:    Ca
10790 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
107a0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
107b0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
107c0 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   A==B..**.**    
107d0 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AgtB:    Called 
107e0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
107f0 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
10800 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e  outines and A>B.
10810 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  .**.**    EofA: 
10820 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
10830 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
10840 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a   from selectA..*
10850 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20  *.**    EofB:   
10860 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
10870 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
10880 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a  rom selectB..**.
10890 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
108a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74  ation of the lat
108b0 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74  ter five subrout
108c0 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77  ines depend on w
108d0 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74  hich .** <operat
108e0 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a  or> is used:.**.
108f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
10900 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20    UNION ALL     
10910 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20      UNION       
10920 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20       EXCEPT     
10930 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a       INTERSECT.*
10940 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  *          -----
10950 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
10960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
10970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
10980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
10990 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41  *   AltB:   outA
109a0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
109b0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
109c0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
109d0 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20     nextA.**.**  
109e0 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AeqB:   outA, n
109f0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
10a00 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  tA             n
10a10 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74  extA         out
10a20 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20  A, nextA.**.**  
10a30 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e   AgtB:   outB, n
10a40 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
10a50 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e  nextB          n
10a60 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20  extB            
10a70 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f  nextB.**.**   Eo
10a80 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  fA:   outB, next
10a90 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
10aa0 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74  tB          halt
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c               hal
10ac0 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20  t.**.**   EofB: 
10ad0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
10ae0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
10af0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
10b00 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
10b10 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c  .** In the AltB,
10b20 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20   AeqB, and AgtB 
10b30 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20  subroutines, an 
10b40 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69  EOF on A followi
10b50 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73  ng nextA.** caus
10b60 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
10b70 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64  jump to EofA and
10b80 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c   an EOF on B fol
10b90 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75  lowing nextB cau
10ba0 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69  ses.** an immedi
10bb0 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42  ate jump to EofB
10bc0 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61  .  Within EofA a
10bd0 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46  nd EofB, and EOF
10be0 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20   on entry or.** 
10bf0 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20  following nextX 
10c00 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f  causes a jump to
10c10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10c20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
10c30 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  g..**.** Duplica
10c40 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68  te removal in th
10c50 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  e UNION, EXCEPT,
10c60 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63   and INTERSECT c
10c70 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a  ases is handled.
10c80 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75  ** within the ou
10c90 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  tput subroutine.
10ca0 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65    The regPrev re
10cb0 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73  gister set holds
10cc0 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a   the previously.
10cd0 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e  ** output value.
10ce0 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69    A comparison i
10cf0 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74  s made against t
10d00 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68  his value and th
10d10 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73  e output.** is s
10d20 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65  kipped if the ne
10d30 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64  xt results would
10d40 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
10d50 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a  the previous..**
10d60 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
10d70 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74  tation plan is t
10d80 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
10d90 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  two coroutines a
10da0 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72  nd seven.** subr
10db0 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74  outines first, t
10dc0 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74  hen put the cont
10dd0 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65  rol logic at the
10de0 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74   bottom.  Like t
10df0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
10e00 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a      goto Init.**
10e10 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74       coA: corout
10e20 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65  ine for left que
10e30 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f  ry (A).**     co
10e40 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  B: coroutine for
10e50 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29   right query (B)
10e60 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74  .**    outA: out
10e70 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41  put one row of A
10e80 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74  .**    outB: out
10e90 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42  put one row of B
10ea0 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f   (UNION and UNIO
10eb0 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20  N ALL only).**  
10ec0 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofA: ....**  
10ed0 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofB: ....**  
10ee0 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AltB: ....**  
10ef0 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AeqB: ....**  
10f00 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AgtB: ....**  
10f10 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69    Init: initiali
10f20 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67  ze coroutine reg
10f30 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20  isters.**       
10f40 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20     yield coA.** 
10f50 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
10f60 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20  A) goto EofA.** 
10f70 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
10f80 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oB.**          i
10f90 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f  f eof(B) goto Eo
10fa0 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43  fB.**    Cmpr: C
10fb0 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20  ompare A, B.**  
10fc0 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74          Jump Alt
10fd0 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a  B, AeqB, AgtB.**
10fe0 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a       End: ....**
10ff0 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42  .** We call AltB
11000 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f  , AeqB, AgtB, Eo
11010 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75  fA, and EofB "su
11020 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74  broutines" but t
11030 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  hey are not.** a
11040 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75  ctually called u
11050 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74  sing Gosub and t
11060 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72  hey do not Retur
11070 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  n.  EofA and Eof
11080 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20  B loop.** until 
11090 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61  all data is exha
110a0 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20  usted then jump 
110b0 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62  to the "end" lab
110c0 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a  e.  AltB, AeqB,.
110d0 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70  ** and AgtB jump
110e0 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72   to either L2 or
110f0 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20   to one of EofA 
11100 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e  or EofB..*/.#ifn
11110 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11120 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
11130 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
11140 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
11150 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11160 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
11170 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
11180 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
11190 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
111a0 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
111b0 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
111c0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
111d0 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
111e0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
111f0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
11200 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
11210 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
11220 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65  counters */.  Se
11230 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
11240 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
11250 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
11260 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
11270 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
11280 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
11290 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
112a0 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
112b0 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20  ctDest destA;   
112c0 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
112d0 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41   for coroutine A
112e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
112f0 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44   destB;     /* D
11300 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
11310 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20  oroutine B */.  
11320 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20  int regAddrA;   
11330 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
11340 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
11350 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
11360 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66   */.  int regEof
11370 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  A;          /* F
11380 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20  lag to indicate 
11390 77 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73  when select-A is
113a0 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69   complete */.  i
113b0 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20  nt regAddrB;    
113c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
113d0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
113e0 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
113f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42  */.  int regEofB
11400 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
11410 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ag to indicate w
11420 68 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20  hen select-B is 
11430 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  complete */.  in
11440 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20  t addrSelectA;  
11450 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
11460 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63  f the select-A c
11470 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
11480 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20  t addrSelectB;  
11490 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
114a0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63  f the select-B c
114b0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
114c0 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20  t regOutA;      
114d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
114e0 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
114f0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
11500 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
11510 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f  OutB;          /
11520 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
11530 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
11540 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
11550 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41  /.  int addrOutA
11560 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
11570 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
11580 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
11590 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
115a0 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64  B = 0;     /* Ad
115b0 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
115c0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
115d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
115e0 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fA;         /* A
115f0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
11600 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64  lect-A-exhausted
11610 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
11620 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20   int addrEofB;  
11630 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
11640 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
11650 42 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  B-exhausted subr
11660 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
11670 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20  addrAltB;       
11680 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
11690 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69  the A<B subrouti
116a0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
116b0 41 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AeqB;         /*
116c0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
116d0 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  A==B subroutine 
116e0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74  */.  int addrAgt
116f0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
11700 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42  dress of the A>B
11710 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
11720 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20   int regLimitA; 
11730 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
11740 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
11750 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
11760 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20  egLimitB;       
11770 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
11780 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
11790 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
117a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
117b0 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
117c0 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69  rs to hold previ
117d0 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ous output */.  
117e0 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20  int savedLimit; 
117f0 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
11800 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69  alue of p->iLimi
11810 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
11820 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
11830 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
11840 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ->iOffset */.  i
11850 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20  nt labelCmpr;   
11860 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
11870 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
11880 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74  he merge algorit
11890 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  hm */.  int labe
118a0 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  lEnd;         /*
118b0 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65   Label for the e
118c0 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c  nd of the overal
118d0 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f  l SELECT stmt */
118e0 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20  .  int j1;      
118f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
11900 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
11910 61 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74  at get retargett
11920 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ed */.  int op; 
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11940 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20   One of TK_ALL, 
11950 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
11960 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43  EPT, TK_INTERSEC
11970 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  T */.  KeyInfo *
11980 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20  pKeyDup = 0; /* 
11990 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
119a0 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  mation for dupli
119b0 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a  cate removal */.
119c0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d    KeyInfo *pKeyM
119d0 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61  erge;   /* Compa
119e0 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
119f0 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f  n for merging ro
11a00 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ws */.  sqlite3 
11a10 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
11a20 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
11a30 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  tion */.  ExprLi
11a40 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
11a50 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
11a60 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
11a70 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
11a80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
11a90 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
11aa0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
11ab0 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20   int *aPermute; 
11ac0 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
11ad0 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20  g from ORDER BY 
11ae0 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20  terms to result 
11af0 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a  set columns */..
11b00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
11b10 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
11b20 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
11b30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
11b40 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
11b50 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
11b60 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
11b70 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
11b80 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
11b90 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
11ba0 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
11bb0 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
11bc0 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
11bd0 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
11be0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
11bf0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
11c00 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
11c10 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11c20 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
11c30 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
11c40 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
11c50 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
11c60 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
11c70 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
11c80 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
11c90 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
11ca0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
11cb0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
11cc0 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
11cd0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
11ce0 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
11cf0 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
11d00 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
11d10 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
11d20 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
11d30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
11d40 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
11d50 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
11d60 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
11d70 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
11d80 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
11d90 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
11da0 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
11db0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
11dc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
11dd0 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
11de0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
11df0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
11e00 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
11e10 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
11e20 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
11e30 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
11e40 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
11e50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11e60 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29   pItem->iCol>0 )
11e70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
11e80 74 65 6d 2d 3e 69 43 6f 6c 3d 3d 69 20 29 20 62  tem->iCol==i ) b
11e90 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
11ea0 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
11eb0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
11ec0 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
11ed0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
11ee0 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
11ef0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
11f00 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
11f10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
11f20 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
11f30 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
11f40 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
11f50 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  e = i;.        p
11f60 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
11f70 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
11f80 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
11f90 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
11fa0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72   pOrderBy->a[nOr
11fb0 64 65 72 42 79 2b 2b 5d 2e 69 43 6f 6c 20 3d 20  derBy++].iCol = 
11fc0 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
11fd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11fe0 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
11ff0 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
12000 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
12010 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
12020 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
12030 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
12040 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
12050 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
12060 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
12070 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
12080 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
12090 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
120a0 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
120b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
120c0 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
120d0 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
120e0 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
120f0 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
12100 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
12110 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
12120 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
12130 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
12140 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
12150 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
12160 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65  izeof(int)*nOrde
12170 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72  rBy);.  if( aPer
12180 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
12190 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
121a0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72   *pItem;.    for
121b0 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
121c0 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65  erBy->a; i<nOrde
121d0 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
121e0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
121f0 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20  ( pItem->iCol>0 
12200 20 26 26 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c   && pItem->iCol<
12210 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
12220 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d  r );.      aPerm
12230 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  ute[i] = pItem->
12240 69 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  iCol - 1;.    }.
12250 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a      pKeyMerge =.
12260 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 4d        sqlite3DbM
12270 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
12280 65 6f 66 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b  eof(*pKeyMerge)+
12290 6e 4f 72 64 65 72 42 79 2a 28 73 69 7a 65 6f 66  nOrderBy*(sizeof
122a0 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a  (CollSeq*)+1));.
122b0 20 20 20 20 69 66 28 20 70 4b 65 79 4d 65 72 67      if( pKeyMerg
122c0 65 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d  e ){.      pKeyM
122d0 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72  erge->aSortOrder
122e0 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 4d 65 72   = (u8*)&pKeyMer
122f0 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72  ge->aColl[nOrder
12300 42 79 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d  By];.      pKeyM
12310 65 72 67 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 28  erge->nField = (
12320 75 31 36 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20  u16)nOrderBy;.  
12330 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65      pKeyMerge->e
12340 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
12350 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
12360 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
12370 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
12380 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45  pColl;.        E
12390 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72  xpr *pTerm = pOr
123a0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
123b0 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  r;.        if( p
123c0 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50  Term->flags & EP
123d0 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  _ExpCollate ){. 
123e0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
123f0 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20   pTerm->pColl;. 
12400 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12410 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
12420 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
12430 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50  eq(pParse, p, aP
12440 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20  ermute[i]);.    
12450 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61        pTerm->fla
12460 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c  gs |= EP_ExpColl
12470 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ate;.          p
12480 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43  Term->pColl = pC
12490 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oll;.        }. 
124a0 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65         pKeyMerge
124b0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
124c0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  ll;.        pKey
124d0 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65  Merge->aSortOrde
124e0 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
124f0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
12500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
12520 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
12530 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68    /* Reattach th
12540 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
12550 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a  e to the query..
12560 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72    */.  p->pOrder
12570 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
12580 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
12590 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
125a0 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
125b0 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  b, pOrderBy, 0);
125c0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
125d0 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f  a range of tempo
125e0 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
125f0 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e  nd the KeyInfo n
12600 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74  eeded.  ** for t
12610 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65  he logic that re
12620 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20  moves duplicate 
12630 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e  result rows when
12640 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
12650 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43  or is UNION, EXC
12660 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
12670 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e  T (but not UNION
12680 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66   ALL)..  */.  if
12690 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
126a0 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b      regPrev = 0;
126b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
126c0 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
126d0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
126e0 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
126f0 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  >=nExpr || db->m
12700 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
12710 20 20 20 72 65 67 50 72 65 76 20 3d 20 73 71 6c     regPrev = sql
12720 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
12730 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 31  (pParse, nExpr+1
12740 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12750 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12760 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72  nteger, 0, regPr
12770 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70  ev);.    pKeyDup
12780 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
12790 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20  ocZero(db,.     
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
127b0 65 6f 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20  eof(*pKeyDup) + 
127c0 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f  nExpr*(sizeof(Co
127d0 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20  llSeq*)+1) );.  
127e0 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
127f0 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
12800 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
12810 2a 29 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c  *)&pKeyDup->aCol
12820 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20  l[nExpr];.      
12830 70 4b 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20  pKeyDup->nField 
12840 3d 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20 20  = (u16)nExpr;.  
12850 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63      pKeyDup->enc
12860 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
12870 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
12880 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
12890 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c    pKeyDup->aColl
128a0 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
128b0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
128c0 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   p, i);.        
128d0 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
128e0 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  der[i] = 0;.    
128f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a    }.    }.  }. .
12900 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68    /* Separate th
12910 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72  e left and the r
12920 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20  ight query from 
12930 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f  one another.  */
12940 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
12950 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  ;.  pPrior->pRig
12960 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 73 71  htmost = 0;.  sq
12970 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
12980 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
12990 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
129a0 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28   "ORDER");.  if(
129b0 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d   pPrior->pPrior=
129c0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
129d0 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
129e0 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72  upBy(pParse, pPr
129f0 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ior, pPrior->pOr
12a00 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
12a10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
12a20 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  te the limit reg
12a30 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70  isters */.  comp
12a40 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
12a50 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62  s(pParse, p, lab
12a60 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d  elEnd);.  if( p-
12a70 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54  >iLimit && op==T
12a80 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
12a90 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73  LimitA = ++pPars
12aa0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
12ab0 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73  LimitB = ++pPars
12ac0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
12ad0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12ae0 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f  , OP_Copy, p->iO
12af0 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73  ffset ? p->iOffs
12b00 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74  et+1 : p->iLimit
12b10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b30 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a      regLimitA);.
12b40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12b50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
12b60 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67  , regLimitA, reg
12b70 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65  LimitB);.  }else
12b80 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
12b90 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b  = regLimitB = 0;
12ba0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
12bb0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
12bc0 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c  pLimit);.  p->pL
12bd0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  imit = 0;.  sqli
12be0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
12bf0 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20  , p->pOffset);. 
12c00 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
12c10 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b  ..  regAddrA = +
12c20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12c30 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61   regEofA = ++pPa
12c40 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
12c50 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65  AddrB = ++pParse
12c60 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66  ->nMem;.  regEof
12c70 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
12c80 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20  em;.  regOutA = 
12c90 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12ca0 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50    regOutB = ++pP
12cb0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
12cc0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
12cd0 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f  nit(&destA, SRT_
12ce0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
12cf0 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  drA);.  sqlite3S
12d00 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
12d10 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estB, SRT_Corout
12d20 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
12d30 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20  .  /* Jump past 
12d40 74 68 65 20 76 61 72 69 6f 75 73 20 73 75 62 72  the various subr
12d50 6f 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f  outines and coro
12d60 75 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61  utines to the ma
12d70 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f  in.  ** merge lo
12d80 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73  op.  */.  j1 = s
12d90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
12da0 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
12db0 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
12dc0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
12dd0 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20  Addr(v);...  /* 
12de0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
12df0 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
12e00 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
12e10 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  ement to the.  *
12e20 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f  * left of the co
12e30 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20  mpound operator 
12e40 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74  - the "A" select
12e50 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
12e60 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
12e70 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  gin coroutine fo
12e80 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29  r left SELECT"))
12e90 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
12ea0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
12eb0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
12ec0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
12ed0 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
12ee0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12ef0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
12f00 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  egEofA);.  sqlit
12f10 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12f20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
12f30 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  rA);.  VdbeNoopC
12f40 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
12f50 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
12f60 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20  ft SELECT"));.. 
12f70 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
12f80 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
12f90 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
12fa0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20  statement on .  
12fb0 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74  ** the right - t
12fc0 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20  he "B" select.  
12fd0 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42  */.  addrSelectB
12fe0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
12ff0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
13000 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
13010 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75  (v, "Begin corou
13020 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53  tine for right S
13030 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65  ELECT"));.  save
13040 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  dLimit = p->iLim
13050 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65  it;.  savedOffse
13060 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
13070 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65    p->iLimit = re
13080 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f  gLimitB;.  p->iO
13090 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 73  ffset = 0;  .  s
130a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
130b0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b  rse, p, &destB);
130c0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73  .  p->iLimit = s
130d0 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e  avedLimit;.  p->
130e0 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f  iOffset = savedO
130f0 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  ffset;.  sqlite3
13100 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13110 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
13120 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
13130 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13140 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
13150 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  );.  VdbeNoopCom
13160 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f  ment((v, "End co
13170 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
13180 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20  t SELECT"));..  
13190 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
131a0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
131b0 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
131c0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20  t row of the A. 
131d0 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
131e0 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
131f0 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
13200 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
13210 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
13220 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
13230 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20  tine for A"));. 
13240 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65   addrOutA = gene
13250 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
13260 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
13280 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20   &destA, pDest, 
13290 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20  regOutA,.       
132a0 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
132b0 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b  v, pKeyDup, P4_K
132c0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20  EYINFO_HANDOFF, 
132d0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20  labelEnd);.  .  
132e0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
132f0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
13300 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
13310 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20  t row of the B. 
13320 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
13330 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
13340 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
13350 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
13360 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
13370 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
13380 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  ){.    VdbeNoopC
13390 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
133a0 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42  ut routine for B
133b0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74  "));.    addrOut
133c0 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  B = generateOutp
133d0 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
133e0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
133f0 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c        p, &destB,
13400 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c   pDest, regOutB,
13410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13420 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
13430 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53  up, P4_KEYINFO_S
13440 54 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29  TATIC, labelEnd)
13450 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
13460 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
13470 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
13480 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
13490 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65  elect A.  ** are
134a0 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
134b0 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
134c0 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct B remains..  
134d0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
134e0 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20  ment((v, "eof-A 
134f0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
13500 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
13510 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
13520 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
13530 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
13540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13550 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45  _Goto, 0, labelE
13560 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  nd);.  }else{  .
13570 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
13580 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13590 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
135a0 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  fB, labelEnd);. 
135b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
135c0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
135d0 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
135e0 75 74 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utB);.    sqlite
135f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
13600 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
13610 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B);.    sqlite3V
13620 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13630 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
13640 41 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  A);.  }..  /* Ge
13650 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
13660 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
13670 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
13680 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
13690 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
136a0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
136b0 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
136c0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
136d0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
136e0 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
136f0 64 72 45 6f 66 41 3b 0a 20 20 7d 65 6c 73 65 7b  drEofA;.  }else{
13700 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
13710 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
13720 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
13730 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
13740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13750 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
13760 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  ofA, labelEnd);.
13770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13780 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
13790 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
137a0 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutA);.    sqlit
137b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
137c0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
137d0 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rA);.    sqlite3
137e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
137f0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f  _Goto, 0, addrEo
13800 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  fB);.  }..  /* G
13810 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13820 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
13830 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64  of A<B.  */.  Vd
13840 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
13850 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75  , "A-lt-B subrou
13860 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
13870 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ltB = sqlite3Vdb
13880 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13890 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
138a0 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74  drOutA);.  sqlit
138b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
138c0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
138d0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rA);.  sqlite3Vd
138e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
138f0 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
13900 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
13910 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13920 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
13930 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  mpr);..  /* Gene
13940 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
13950 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
13960 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20  A==B.  */.  if( 
13970 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
13980 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
13990 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69  rAltB;.  }else i
139a0 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
139b0 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ECT ){.    addrA
139c0 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
139d0 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a      addrAltB++;.
139e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62    }else{.    Vdb
139f0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
13a00 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74   "A-eq-B subrout
13a10 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
13a20 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74  AeqB =.    sqlit
13a30 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13a40 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
13a50 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rA);.    sqlite3
13a60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13a70 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64  _If, regEofA, ad
13a80 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c  drEofA);.    sql
13a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13aa0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
13ab0 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20  belCmpr);.  }.. 
13ac0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13ad0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
13ae0 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f  case of A>B.  */
13af0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
13b00 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73  nt((v, "A-gt-B s
13b10 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
13b20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74  addrAgtB = sqlit
13b30 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
13b40 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r(v);.  if( op==
13b50 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
13b60 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71  _UNION ){.    sq
13b70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13b80 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
13b90 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
13ba0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
13bb0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
13bc0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b  ield, regAddrB);
13bd0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13be0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
13bf0 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42  egEofB, addrEofB
13c00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13c10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
13c20 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
13c30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ;..  /* This cod
13c40 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69  e runs once to i
13c50 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74  nitialize everyt
13c60 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  hing..  */.  sql
13c70 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
13c80 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74  (v, j1);.  sqlit
13c90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13ca0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
13cb0 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  egEofA);.  sqlit
13cc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13cd0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
13ce0 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  egEofB);.  sqlit
13cf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13d00 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64  OP_Gosub, regAdd
13d10 72 41 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29  rA, addrSelectA)
13d20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13d30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
13d40 62 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  b, regAddrB, add
13d50 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c  rSelectB);.  sql
13d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13d70 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
13d80 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73  , addrEofA);.  s
13d90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13da0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
13db0 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a  fB, addrEofB);..
13dc0 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74    /* Implement t
13dd0 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f  he main merge lo
13de0 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
13df0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
13e00 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  l(v, labelCmpr);
13e10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13e20 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75  dOp4(v, OP_Permu
13e30 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c  tation, 0, 0, 0,
13e40 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65   (char*)aPermute
13e50 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a  , P4_INTARRAY);.
13e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13e70 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
13e80 65 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64  e, destA.iMem, d
13e90 65 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65  estB.iMem, nOrde
13ea0 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
13ec0 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20  har*)pKeyMerge, 
13ed0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
13ee0 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  FF);.  sqlite3Vd
13ef0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
13f00 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61  ump, addrAltB, a
13f10 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74  ddrAeqB, addrAgt
13f20 42 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  B);..  /* Releas
13f30 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  e temporary regi
13f40 73 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  sters.  */.  if(
13f50 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
13f60 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
13f70 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
13f80 72 65 67 50 72 65 76 2c 20 6e 4f 72 64 65 72 42  regPrev, nOrderB
13f90 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  y+1);.  }..  /* 
13fa0 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73  Jump to the this
13fb0 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
13fc0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
13fd0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73   query..  */.  s
13fe0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
13ff0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45  eLabel(v, labelE
14000 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  nd);..  /* Set t
14010 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
14020 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  put columns.  */
14030 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
14040 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
14050 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
14060 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a  First = pPrior;.
14070 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
14080 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
14090 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
140a0 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74  ior;.    generat
140b0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
140c0 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
140d0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
140e0 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
140f0 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
14100 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
14110 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
14120 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
14130 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
14140 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
14150 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
14160 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
14170 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
14180 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
14190 20 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a   pPrior;..  /***
141a0 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75   TBD:  Insert su
141b0 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74  broutine calls t
141c0 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  o close cursors 
141d0 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20  on incomplete.  
141e0 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  **** subqueries 
141f0 2a 2a 2a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53  ****/.  return S
14200 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
14210 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
14220 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
14230 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
14240 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
14250 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20  IEW)./* Forward 
14260 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  Declarations */.
14270 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
14280 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65  tExprList(sqlite
14290 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69  3*, ExprList*, i
142a0 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  nt, ExprList*);.
142b0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
142c0 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a  tSelect(sqlite3*
142d0 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  , Select *, int,
142e0 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f   ExprList *);../
142f0 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
14300 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
14310 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
14320 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
14330 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
14340 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
14350 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
14360 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
14370 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
14380 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
14390 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
143a0 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
143b0 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
143c0 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
143d0 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
143e0 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
143f0 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
14400 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
14410 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
14420 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
14430 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
14440 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
14450 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
14460 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
14470 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
14480 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
14490 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
144a0 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
144b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
144c0 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
144d0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
144e0 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
144f0 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
14500 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
14510 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
14520 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
14530 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
14540 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
14550 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
14560 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74  bstExpr(.  sqlit
14570 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
14580 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
14590 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63  errors to this c
145a0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
145b0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
145c0 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68     /* Expr in wh
145d0 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ich substitution
145e0 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74   occurs */.  int
145f0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
14600 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
14610 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
14620 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
14630 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75  t    /* Substitu
14640 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  te expressions *
14650 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
14660 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
14670 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
14680 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
14690 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
146a0 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
146b0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
146c0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
146d0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
146e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
146f0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
14700 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
14710 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
14720 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
14730 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
14740 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
14750 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
14760 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
14770 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
14780 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  xprDup(db, pELis
14790 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
147a0 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  umn].pExpr, 0);.
147b0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
147c0 26 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29  & pExpr->pColl )
147d0 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
147e0 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70  pColl = pExpr->p
147f0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
14800 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
14810 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
14820 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
14830 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pNew;.    }.  }e
14840 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  lse{.    pExpr->
14850 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
14860 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
14870 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
14880 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  st);.    pExpr->
14890 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78  pRight = substEx
148a0 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
148b0 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
148c0 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45  List);.    if( E
148d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
148e0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
148f0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
14900 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
14910 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69  pr->x.pSelect, i
14920 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14940 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
14950 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  b, pExpr->x.pLis
14960 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
14970 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
14980 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
14990 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
149a0 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
149b0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
149c0 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
149d0 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
149e0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
149f0 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
14a00 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
14a10 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
14a20 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
14a30 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
14a40 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
14a50 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
14a60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
14a70 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
14a80 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
14a90 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
14aa0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14ab0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
14ac0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
14ad0 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74   i++){.    pList
14ae0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
14af0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69  ubstExpr(db, pLi
14b00 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
14b10 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
14b20 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
14b30 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
14b40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
14b50 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
14b60 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
14b70 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
14b80 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
14b90 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14ba0 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
14bb0 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
14bc0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
14bd0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
14be0 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
14bf0 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
14c00 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
14c10 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
14c20 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  s */.){.  SrcLis
14c30 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
14c40 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
14c50 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
14c60 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
14c70 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  n;.  substExprLi
14c80 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  st(db, p->pEList
14c90 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14ca0 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
14cb0 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  st(db, p->pGroup
14cc0 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
14cd0 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
14ce0 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64  List(db, p->pOrd
14cf0 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  erBy, iTable, pE
14d00 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76  List);.  p->pHav
14d10 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
14d20 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
14d30 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
14d40 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73  .  p->pWhere = s
14d50 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
14d60 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20  pWhere, iTable, 
14d70 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
14d80 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50  Select(db, p->pP
14d90 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  rior, iTable, pE
14da0 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20  List);.  pSrc = 
14db0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
14dc0 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45  t( pSrc );  /* E
14dd0 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20  ven for (SELECT 
14de0 31 29 20 77 65 20 68 61 76 65 3a 20 70 53 72 63  1) we have: pSrc
14df0 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53  !=0 but pSrc->nS
14e00 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41  rc==0 */.  if( A
14e10 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20  LWAYS(pSrc) ){. 
14e20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
14e30 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d  Src, pItem=pSrc-
14e40 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
14e50 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75  tem++){.      su
14e60 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49  bstSelect(db, pI
14e70 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  tem->pSelect, iT
14e80 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
14e90 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
14ea0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
14eb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
14ec0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
14ed0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
14ee0 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
14ef0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
14f00 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
14f10 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14f20 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _VIEW)./*.** Thi
14f30 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
14f40 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
14f50 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65  bqueries in orde
14f60 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78  r to speed.** ex
14f70 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  ecution.  It ret
14f80 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
14f90 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
14fa0 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
14fb0 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  g.** occurs..**.
14fc0 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
14fd0 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
14fe0 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
14ff0 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
15000 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
15010 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
15020 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
15030 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
15040 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
15050 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
15060 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
15070 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
15080 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
15090 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
150a0 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
150b0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
150c0 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
150d0 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
150e0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
150f0 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
15100 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
15110 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
15120 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
15130 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
15140 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
15150 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15160 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
15170 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
15180 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
15190 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
151a0 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
151b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
151c0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
151d0 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
151e0 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
151f0 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
15200 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
15210 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
15220 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
15230 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
15240 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
15250 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
15260 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
15270 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20  s simpification 
15280 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
15290 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
152a0 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
152b0 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
152c0 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
152d0 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
152e0 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
152f0 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
15300 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
15310 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
15320 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
15330 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
15340 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
15350 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
15360 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
15370 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
15380 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
15390 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
153a0 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
153b0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
153c0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
153d0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
153e0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
153f0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
15400 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  n..**.**   (3)  
15410 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
15420 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70  not the right op
15430 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
15440 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20  outer join.**   
15450 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79       (Originally
15460 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53   ticket #306.  S
15470 74 72 65 6e 67 68 74 65 6e 65 64 20 62 79 20 74  trenghtened by t
15480 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a  icket #3300).**.
15490 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
154a0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
154b0 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
154c0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
154d0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
154e0 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65   (5)  The subque
154f0 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
15500 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
15510 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
15520 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
15530 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
15540 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65   (6)  The subque
15550 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
15560 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
15570 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
15580 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
15590 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
155a0 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65   (7)  The subque
155b0 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c  ry has a FROM cl
155c0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  ause..**.**   (8
155d0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
155e0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
155f0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
15600 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
15610 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
15620 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
15630 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
15640 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
15650 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
15660 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
15670 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
15680 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72  10)  The subquer
15690 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
156a0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
156b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
156c0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
156d0 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
156e0 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
156f0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
15700 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
15710 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
15720 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
15730 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70  *  (**)  Not imp
15740 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75  lemented.  Subsu
15750 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
15760 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70  tion (3).  Was p
15770 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20  reviously.**    
15780 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72      a separate r
15790 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76  estriction deriv
157a0 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20  ing from ticket 
157b0 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350..**.**  (13
157c0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
157d0 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
157e0 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
157f0 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34  LIMIT.**.**  (14
15800 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
15810 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46  does not use OFF
15820 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  SET.**.**  (15) 
15830 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
15840 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
15850 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
15860 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
15870 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
15880 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
15890 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
158a0 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
158b0 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
158c0 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
158d0 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
158e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
158f0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
15900 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
15910 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
15920 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
15930 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
15940 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
15950 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
15960 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
15970 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
15980 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
15990 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
159a0 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
159b0 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
159c0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
159d0 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
159e0 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
159f0 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
15a00 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
15a10 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
15a20 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
15a30 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
15a40 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
15a50 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
15a60 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
15a70 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
15a80 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
15a90 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
15aa0 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
15ab0 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
15ac0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68 61  **          * ha
15ad0 73 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  s no other table
15ae0 73 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73  s or sub-selects
15af0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
15b00 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  use..**.**      
15b10 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64    The parent and
15b20 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63   sub-query may c
15b30 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61  ontain WHERE cla
15b40 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f  uses. Subject to
15b50 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73  .**        rules
15b60 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20   (11), (13) and 
15b70 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61  (14), they may a
15b80 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  lso contain ORDE
15b90 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20  R BY,.**        
15ba0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
15bb0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
15bc0 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75   (18)  If the su
15bd0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
15be0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
15bf0 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  en all terms of 
15c00 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52  the.**        OR
15c10 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66  DER by clause of
15c20 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74   the parent must
15c30 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72   be simple refer
15c40 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20  ences to .**    
15c50 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
15c60 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
15c70 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73  .**  (19)  The s
15c80 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
15c90 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
15ca0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
15cb0 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
15cc0 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c   have a WHERE cl
15cd0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30  ause..**.**  (20
15ce0 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
15cf0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
15d00 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69  d select, then i
15d10 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a  t must not use.*
15d20 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45  *        an ORDE
15d30 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69  R BY clause.  Ti
15d40 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20  cket #3773.  We 
15d50 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73  could relax this
15d60 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20   constraint.**  
15d70 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62        somewhat b
15d80 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68  y saying that th
15d90 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  e terms of the O
15da0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d  RDER BY clause m
15db0 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70  ust.**        ap
15dc0 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69  pear as unmodifi
15dd0 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ed result column
15de0 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
15df0 75 65 72 79 2e 20 20 42 75 74 0a 2a 2a 20 20 20  uery.  But.**   
15e00 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
15e10 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
15e20 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
15e30 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
15e40 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
15e50 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
15e60 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
15e70 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
15e80 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
15e90 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
15ea0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
15eb0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
15ec0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
15ed0 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
15ee0 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
15ef0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
15f00 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
15f10 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
15f20 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
15f30 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
15f40 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
15f50 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
15f60 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
15f70 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
15f80 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
15f90 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
15fa0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
15fb0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
15fc0 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
15fd0 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
15fe0 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
15ff0 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
16000 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
16010 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
16020 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
16030 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
16040 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
16050 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
16060 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
16070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16080 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
16090 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
160a0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
160b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
160c0 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
160d0 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
160e0 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
160f0 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
16100 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
16110 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
16120 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
16130 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
16140 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
16150 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
16160 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
16170 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
16180 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
16190 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
161a0 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
161b0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
161c0 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
161d0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  ;.  Select *pSub
161e0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
161f0 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
16200 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
16210 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
16220 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
16230 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
16240 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
16250 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
16260 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
16270 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
16280 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16290 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
162a0 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
162b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
162c0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
162d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
162e0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
162f0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
16300 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
16310 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
16320 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
16330 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
16340 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
16350 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
16360 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
16370 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
16380 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
16390 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
163a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
163b0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
163c0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
163d0 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
163e0 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
163f0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
16400 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
16410 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
16420 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
16430 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
16440 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
16450 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
16460 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
16470 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
16480 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65  =0 );  /* Unable
16490 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70   to flatten comp
164a0 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a  ound queries */.
164b0 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
164c0 26 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c  & SQLITE_QueryFl
164d0 61 74 74 65 6e 65 72 20 29 20 72 65 74 75 72 6e  attener ) return
164e0 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
164f0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
16500 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
16510 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
16520 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
16530 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
16540 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
16550 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
16560 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
16570 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
16580 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
16590 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67  =0 );.  if( isAg
165a0 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  g && subqueryIsA
165b0 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  gg ) return 0;  
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
165d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
165e0 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71  )  */.  if( subq
165f0 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72  ueryIsAgg && pSr
16600 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
16610 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
16620 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
16630 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20  )  */.  pSubSrc 
16640 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
16650 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
16660 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f  );.  /* Prior to
16670 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20   version 3.1.2, 
16680 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
16690 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20  FFSET had to be 
166a0 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73  simple constants
166b0 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74  ,.  ** not arbit
166c0 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e  rary expresssion
166d0 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
166e0 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
166f0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
16700 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
16710 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
16720 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
16730 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
16740 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
16750 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
16760 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
16770 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
16780 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
16790 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
167a0 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
167b0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
167c0 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
167d0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
167e0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
167f0 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
16800 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65  if( pSub->pOffse
16810 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
16840 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
16850 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
16860 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t && pSub->pLimi
16870 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
16880 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
168b0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35   Restriction (15
168c0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
168d0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
168e0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16900 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16910 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28   (7)  */.  if( (
16920 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
16930 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
16940 30 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69  0 || pSub->pLimi
16950 74 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  t) .         && 
16960 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
16970 20 69 73 41 67 67 29 20 29 7b 20 20 20 20 20 20   isAgg) ){      
16980 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
16990 6f 6e 73 20 28 34 29 28 35 29 28 38 29 28 39 29  ons (4)(5)(8)(9)
169a0 20 2a 2f 0a 20 20 20 20 20 72 65 74 75 72 6e 20   */.     return 
169b0 30 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a 20 20  0;       .  }.  
169c0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
169d0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
169e0 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49 73  =0 && subqueryIs
169f0 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75  Agg ){.     retu
16a00 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
16a10 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   Restriction (6)
16a20 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70    */.  }.  if( p
16a30 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
16a40 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
16a50 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
16a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
16a90 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
16aa0 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
16ab0 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
16ac0 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  y ) return 0;   
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16ae0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29  Restriction (16)
16af0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
16b00 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68  pLimit && p->pWh
16b10 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b30 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29  Restriction (19)
16b40 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45   */..  /* OBSOLE
16b50 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20  TE COMMENT 1:.  
16b60 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  ** Restriction 3
16b70 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
16b80 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
16b90 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
16ba0 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
16bb0 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
16bc0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
16bd0 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
16be0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
16bf0 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
16c00 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
16c10 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
16c20 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
16c30 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
16c40 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
16c50 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
16c60 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
16c70 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
16c80 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
16c90 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
16ca0 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
16cb0 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
16cc0 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
16cd0 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    ** OBSOLETE CO
16ce0 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65  MMENT 2:.  ** Re
16cf0 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
16d00 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
16d10 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
16d20 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
16d30 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
16d40 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
16d50 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
16d60 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
16d70 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
16d80 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
16d90 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
16da0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
16db0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
16dc0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
16dd0 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
16de0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
16df0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
16e00 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
16e10 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
16e20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
16e30 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
16e40 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
16e50 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
16e60 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
16e70 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
16e80 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
16e90 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
16ea0 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
16eb0 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
16ec0 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a  NNER JOIN..  **.
16ed0 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49    ** THIS OVERRI
16ee0 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d  DES OBSOLETE COM
16ef0 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42  MENTS 1 AND 2 AB
16f00 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74  OVE:.  ** Ticket
16f10 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61   #3300 shows tha
16f20 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  t flattening the
16f30 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
16f40 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20   LEFT JOIN.  ** 
16f50 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20  is fraught with 
16f60 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f  danger.  Best to
16f70 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65   avoid the whole
16f80 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a   thing.  If the.
16f90 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
16fa0 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
16fb0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
16fc0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74  then do not flat
16fd0 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ten..  */.  if( 
16fe0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
16ff0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
17000 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
17010 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
17020 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66  striction 17: If
17030 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
17040 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
17050 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
17060 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
17070 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
17080 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
17090 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
170a0 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
170b0 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
170c0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
170d0 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
170e0 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
170f0 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
17100 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
17110 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
17120 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
17130 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
17140 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
17150 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32  /* Restriction 2
17160 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 */.    }.    i
17170 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e  f( isAgg || (p->
17180 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
17190 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53  stinct)!=0 || pS
171a0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
171b0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
171c0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75     }.    for(pSu
171d0 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20  b1=pSub; pSub1; 
171e0 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72  pSub1=pSub1->pPr
171f0 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ior){.      test
17200 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
17210 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
17220 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
17230 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
17240 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
17250 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
17260 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
17270 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
17280 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
17290 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  e );.      if( (
172a0 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
172b0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
172c0 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
172d0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
172e0 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
172f0 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
17300 0a 20 20 20 20 20 20 20 7c 7c 20 4e 45 56 45 52  .       || NEVER
17310 28 70 53 75 62 31 2d 3e 70 53 72 63 3d 3d 30 29  (pSub1->pSrc==0)
17320 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
17330 3e 6e 53 72 63 21 3d 31 0a 20 20 20 20 20 20 29  >nSrc!=1.      )
17340 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
17350 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
17360 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
17370 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20  ction 18. */.   
17380 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
17390 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
173a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
173b0 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  ; ii<p->pOrderBy
173c0 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
173d0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
173e0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69  OrderBy->a[ii].i
173f0 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
17400 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
17410 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49  .  }..  /***** I
17420 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
17430 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e  point, flattenin
17440 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
17450 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74  *****/..  /* Aut
17460 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75  horize the subqu
17470 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  ery */.  pParse-
17480 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
17490 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  pSubitem->zName;
174a0 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  .  sqlite3AuthCh
174b0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
174c0 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
174d0 20 30 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a   0);.  pParse->z
174e0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
174f0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
17500 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
17510 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
17520 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
17530 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
17540 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
17550 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
17560 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
17570 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
17580 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
17590 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
175a0 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
175b0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
175c0 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
175d0 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
175e0 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
175f0 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
17600 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
17610 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
17620 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
17630 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
17640 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
17650 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
17660 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
17670 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
17680 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
17690 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
176a0 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
176b0 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
176c0 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
176d0 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
176e0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
176f0 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
17700 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17710 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
17720 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
17730 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
17740 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
17750 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
17760 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
17770 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
17780 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
17790 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
177a0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
177b0 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
177c0 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
177d0 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
177e0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
177f0 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
17800 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
17810 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
17820 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
17830 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
17840 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
17850 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
17860 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
17870 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
17880 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
17890 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
178a0 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
178b0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
178c0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
178d0 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
178e0 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
178f0 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
17900 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
17910 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
17920 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
17930 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
17940 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
17950 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
17960 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
17970 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
17980 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
17990 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
179a0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
179b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
179c0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
179d0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
179e0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
179f0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
17a00 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
17a10 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
17a20 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
17a30 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
17a40 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  it = 0;.    pNew
17a50 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
17a60 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20  Dup(db, p, 0);. 
17a70 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
17a80 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f  Limit;.    p->pO
17a90 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
17aa0 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  y;.    p->pSrc =
17ab0 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70   pSrc;.    p->op
17ac0 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70   = TK_ALL;.    p
17ad0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
17ae0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
17af0 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 ){.      pNew 
17b00 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
17b10 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
17b20 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
17b30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52  ;.      pNew->pR
17b40 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
17b50 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f    }.    p->pPrio
17b60 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69 66  r = pNew;.    if
17b70 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
17b80 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
17b90 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
17ba0 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
17bb0 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
17bc0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17bd0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
17be0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
17bf0 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
17c00 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
17c10 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
17c20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
17c30 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
17c40 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
17c50 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
17c60 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
17c70 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
17c80 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
17c90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17ca0 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
17cb0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
17cc0 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
17cd0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
17ce0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
17cf0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
17d00 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
17d10 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
17d20 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
17d30 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
17d40 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
17d50 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
17d60 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
17d70 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
17d80 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
17d90 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
17da0 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
17db0 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
17dc0 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
17dd0 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
17de0 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
17df0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
17e00 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
17e10 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
17e20 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
17e30 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
17e40 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
17e50 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
17e60 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
17e70 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
17e80 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
17e90 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
17ea0 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
17eb0 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
17ec0 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
17ed0 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29  ToDel->nRef==1 )
17ee0 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70  {.      Parse *p
17ef0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
17f00 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
17f10 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
17f20 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a  TabToDel->pNextZ
17f30 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65  ombie = pTopleve
17f40 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  l->pZombieTab;. 
17f50 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
17f60 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
17f70 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
17f80 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
17f90 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  el->nRef--;.    
17fa0 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
17fb0 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
17fc0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
17fd0 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
17fe0 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
17ff0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
18000 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
18010 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
18020 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
18030 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
18040 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
18050 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
18060 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
18070 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
18080 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
18090 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
180a0 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
180b0 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
180c0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
180d0 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
180e0 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
180f0 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
18100 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
18110 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18120 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
18130 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
18140 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
18150 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
18160 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
18170 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
18180 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
18190 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
181a0 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
181b0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
181c0 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
181d0 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
181e0 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
181f0 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
18200 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
18210 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
18220 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
18230 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
18240 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
18250 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
18260 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
18270 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
18280 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
18290 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
182a0 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
182b0 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
182c0 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
182d0 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
182e0 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
182f0 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
18300 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
18310 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
18320 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
18330 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
18340 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
18350 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
18360 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
18370 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
18380 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
18390 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
183a0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
183b0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
183c0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
183d0 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
183e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
183f0 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
18400 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
18410 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
18420 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
18430 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
18440 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
18450 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
18460 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e  ent!=p );  /* 2n
18470 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
18480 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74   times through t
18490 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
184a0 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
184b0 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
184c0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
184d0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
184e0 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
184f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18500 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18510 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
18520 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
18530 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
18540 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
18550 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
18560 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
18570 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
18580 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
18590 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
185a0 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
185b0 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
185c0 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
185d0 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
185e0 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
185f0 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
18600 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
18610 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
18620 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
18630 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
18640 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
18650 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
18660 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
18670 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
18680 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
18690 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
186a0 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
186b0 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
186c0 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
186d0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
186e0 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
186f0 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
18700 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
18710 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
18720 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
18730 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
18740 20 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74   the out query t
18750 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20  o 4 slots.  The 
18760 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c  middle.    ** sl
18770 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
18780 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
18790 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
187a0 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  ce for the.    *
187b0 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
187c0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
187d0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
187e0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
187f0 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
18800 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
18810 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
18820 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
18830 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
18840 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
18850 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
18860 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
18870 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18880 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
18890 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
188a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
188b0 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
188c0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
188d0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
188e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
188f0 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
18900 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
18910 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
18920 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
18930 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
18940 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
18950 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
18960 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  a[i];.      mems
18970 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
18980 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
18990 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
189a0 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
189b0 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20  iFrom].jointype 
189c0 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20  = jointype;.  . 
189d0 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20     /* Now begin 
189e0 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
189f0 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
18a00 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
18a10 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e   .    ** referen
18a20 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
18a30 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
18a40 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20  query..    ** . 
18a50 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
18a60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
18a70 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
18a80 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
18a90 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
18aa0 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
18ab0 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20  a>b;.    **   \ 
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ad0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
18ae0 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
18af0 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
18b00 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f   /.    **    \__
18b10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18b20 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
18b30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18b40 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
18b50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65      **.    ** We
18b60 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
18b70 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
18b80 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
18b90 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
18ba0 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77  see.    ** "a" w
18bb0 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
18bc0 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
18bd0 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
18be0 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
18bf0 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  0"..    */.    p
18c00 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e  List = pParent->
18c10 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
18c20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
18c30 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
18c40 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
18c50 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  .zName==0 ){.   
18c60 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
18c70 2a 7a 53 70 61 6e 20 3d 20 70 4c 69 73 74 2d 3e  *zSpan = pList->
18c80 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
18c90 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a      if( ALWAYS(z
18ca0 53 70 61 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Span) ){.       
18cb0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
18cc0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
18cd0 53 74 72 44 75 70 28 64 62 2c 20 7a 53 70 61 6e  StrDup(db, zSpan
18ce0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18cf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
18d00 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
18d10 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74   pParent->pEList
18d20 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
18d30 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  >pEList);.    if
18d40 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ( isAgg ){.     
18d50 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
18d60 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  b, pParent->pGro
18d70 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
18d80 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
18d90 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
18da0 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
18db0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
18dc0 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
18dd0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
18de0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
18df0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
18e00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
18e10 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
18e20 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
18e30 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
18e40 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
18e50 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
18e60 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rBy = 0;.    }el
18e70 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  se if( pParent->
18e80 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
18e90 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18ea0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  db, pParent->pOr
18eb0 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
18ec0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
18ed0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
18ee0 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
18ef0 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
18f00 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
18f10 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b  Sub->pWhere, 0);
18f20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18f30 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
18f40 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71    }.    if( subq
18f50 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
18f60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
18f70 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29  nt->pHaving==0 )
18f80 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
18f90 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65  >pHaving = pPare
18fa0 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  nt->pWhere;.    
18fb0 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
18fc0 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
18fd0 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
18fe0 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ng = substExpr(d
18ff0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  b, pParent->pHav
19000 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
19010 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
19020 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
19030 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
19040 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
19050 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20  ->pHaving, .    
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
19080 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
19090 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20   pSub->pHaving, 
190a0 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0));.      asser
190b0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  t( pParent->pGro
190c0 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
190d0 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
190e0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
190f0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
19100 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a  ->pGroupBy, 0);.
19110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19120 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
19130 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
19140 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
19150 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
19160 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
19170 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
19180 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
19190 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
191a0 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
191b0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
191c0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
191d0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
191e0 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
191f0 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  er or the.    **
19200 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
19210 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a  distinct. .    *
19220 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
19230 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
19240 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
19250 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20  istinct;.  .    
19260 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  /*.    ** SELECT
19270 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
19280 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
19290 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
192a0 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a  OFFSET y;.    **
192b0 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  .    ** One is t
192c0 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
192d0 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
192e0 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
192f0 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
19300 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
19310 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
19320 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
19330 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
19340 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
19350 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
19360 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
19370 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  mit;.      pSub-
19380 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
19390 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
193a0 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
193b0 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
193c0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
193d0 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
193e0 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
193f0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
19400 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65  b, pSub1);..  re
19410 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
19420 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
19430 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19440 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
19450 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
19460 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79   */../*.** Analy
19470 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ze the SELECT st
19480 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
19490 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
194a0 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73   see if it.** is
194b0 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
194c0 29 20 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20  ) query. Return 
194d0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
194e0 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
194f0 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74  BY_MAX if .** it
19500 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77   is, or 0 otherw
19510 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c  ise. At present,
19520 20 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73   a query is cons
19530 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20  idered to be.** 
19540 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75  a min()/max() qu
19550 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery if:.**.**   
19560 31 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69  1. There is a si
19570 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74  ngle object in t
19580 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
19590 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65  **.**   2. There
195a0 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70   is a single exp
195b0 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
195c0 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69  esult set, and i
195d0 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74  t is.**      eit
195e0 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61  her min(x) or ma
195f0 78 28 78 29 2c 20 77 68 65 72 65 20 78 20 69 73  x(x), where x is
19600 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65   a column refere
19610 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  nce..*/.static u
19620 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 53 65  8 minMaxQuery(Se
19630 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72  lect *p){.  Expr
19640 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c   *pExpr;.  ExprL
19650 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d  ist *pEList = p-
19660 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  >pEList;..  if( 
19670 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
19680 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f   ) return WHERE_
19690 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
196a0 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74    pExpr = pEList
196b0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
196c0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
196d0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
196e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
196f0 20 4e 45 56 45 52 28 45 78 70 72 48 61 73 50 72   NEVER(ExprHasPr
19700 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
19710 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 20 72  _xIsSelect)) ) r
19720 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
19730 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
19740 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
19750 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e  ==0 || pEList->n
19760 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
19770 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   0;.  if( pEList
19780 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
19790 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
197a0 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  ) return WHERE_O
197b0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
197c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
197d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
197e0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
197f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
19800 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
19810 54 6f 6b 65 6e 2c 22 6d 69 6e 22 29 3d 3d 30 20  Token,"min")==0 
19820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48  ){.    return WH
19830 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
19840 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
19850 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
19860 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 78  r->u.zToken,"max
19870 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")==0 ){.    ret
19880 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
19890 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65 74  Y_MAX;.  }.  ret
198a0 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
198b0 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a  Y_NORMAL;.}../*.
198c0 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
198d0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
198e0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
198f0 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
19900 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
19910 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e  he second argmen
19920 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
19930 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
19940 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
19950 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
19960 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
19970 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
19980 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
19990 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
199a0 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
199b0 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
199c0 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
199d0 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
199e0 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
199f0 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
19a00 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
19a10 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
19a20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
19a30 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
19a40 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
19a50 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
19a60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
19a70 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
19a80 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
19a90 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
19aa0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
19ab0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
19ac0 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
19ad0 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
19ae0 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
19af0 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
19b00 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
19b10 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
19b20 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
19b30 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
19b40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
19b50 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
19b60 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
19b70 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
19b80 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
19b90 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
19ba0 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
19bb0 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
19bc0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
19bd0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
19be0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
19bf0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
19c00 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
19c10 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d    if( (pAggInfo-
19c20 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d  >aFunc[0].pFunc-
19c30 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  >flags&SQLITE_FU
19c40 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
19c50 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
19c60 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
19c70 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
19c80 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
19c90 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
19ca0 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
19cb0 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
19cc0 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
19cd0 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
19ce0 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
19cf0 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
19d00 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
19d10 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
19d20 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
19d30 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
19d40 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
19d50 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
19d60 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
19d70 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
19d80 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
19d90 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
19da0 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
19db0 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
19dc0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
19dd0 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
19de0 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
19df0 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
19e00 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
19e10 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
19e20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
19e30 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78  && pFrom->zIndex
19e40 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
19e50 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
19e60 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
19e70 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e  dex = pFrom->zIn
19e80 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dex;.    Index *
19e90 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
19ea0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
19eb0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
19ec0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
19ed0 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
19ee0 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20  ndex); .        
19ef0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
19f00 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
19f10 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
19f20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19f30 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
19f40 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
19f50 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  ex, 0);.      pP
19f60 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
19f70 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
19f80 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
19f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
19fa0 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  m->pIndex = pIdx
19fb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
19fc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19fd0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19fe0 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
19ff0 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
1a000 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
1a010 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
1a020 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
1a030 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
1a040 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
1a050 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
1a060 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
1a070 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
1a080 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
1a090 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
1a0a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a0b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
1a0c0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
1a0d0 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
1a0e0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
1a0f0 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
1a100 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
1a110 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
1a120 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
1a130 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a140 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
1a150 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
1a160 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
1a170 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
1a180 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
1a190 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
1a1a0 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
1a1b0 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
1a1c0 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
1a1d0 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
1a1e0 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
1a1f0 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
1a200 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
1a210 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
1a220 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
1a230 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
1a240 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
1a250 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
1a260 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
1a270 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
1a280 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
1a290 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
1a2a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1a2b0 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
1a2c0 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
1a2d0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
1a2e0 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
1a2f0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1a300 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
1a310 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
1a320 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
1a330 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
1a340 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
1a350 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
1a360 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
1a370 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
1a380 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
1a390 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
1a3a0 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
1a3b0 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
1a3c0 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
1a3d0 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
1a3e0 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
1a3f0 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
1a400 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
1a410 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
1a420 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
1a430 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
1a440 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
1a450 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
1a460 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
1a470 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
1a480 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
1a490 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
1a4a0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
1a4b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1a4c0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
1a4d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1a4e0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
1a4f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a500 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1a510 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
1a520 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53   if( NEVER(p->pS
1a530 72 63 3d 3d 30 29 20 7c 7c 20 28 70 2d 3e 73 65  rc==0) || (p->se
1a540 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
1a550 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
1a560 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
1a570 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c  ;.  }.  p->selFl
1a580 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
1a590 65 64 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  ed;.  pTabList =
1a5a0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
1a5b0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
1a5c0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1a5d0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
1a5e0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
1a5f0 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
1a600 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
1a610 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1a620 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1a630 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1a640 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
1a650 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
1a660 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
1a670 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
1a680 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
1a690 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1a6a0 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
1a6b0 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
1a6c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1a6d0 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
1a6e0 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
1a6f0 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
1a700 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
1a710 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1a720 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
1a730 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
1a740 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
1a750 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
1a760 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
1a770 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
1a780 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
1a790 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72  Tab;.    if( pFr
1a7a0 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
1a7b0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
1a7c0 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
1a7d0 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
1a7e0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
1a7f0 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
1a800 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
1a810 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
1a820 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1a830 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
1a840 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d   }.    if( pFrom
1a850 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
1a860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a870 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
1a880 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
1a890 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
1a8a0 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
1a8b0 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
1a8c0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1a8d0 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
1a8e0 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a  ert( pSel!=0 );.
1a8f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
1a900 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
1a910 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
1a920 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
1a930 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46   pSel);.      pF
1a940 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
1a950 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1a960 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
1a970 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  f(Table));.     
1a980 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
1a990 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
1a9a0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
1a9b0 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61  f = 1;.      pTa
1a9c0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
1a9d0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
1a9e0 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25  qlite_subquery_%
1a9f0 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62  p_", (void*)pTab
1aa00 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
1aa10 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
1aa20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
1aa30 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c  ior; }.      sel
1aa40 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
1aa50 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1aa60 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  Sel->pEList, &pT
1aa70 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
1aa80 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54  >aCol);.      pT
1aa90 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
1aaa0 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
1aab0 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
1aac0 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  eral;.#endif.   
1aad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
1aae0 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
1aaf0 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
1ab00 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1ab10 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
1ab20 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
1ab30 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
1ab40 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
1ab50 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
1ab60 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
1ab70 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61  rse,0,pFrom->zNa
1ab80 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62  me,pFrom->zDatab
1ab90 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ase);.      if( 
1aba0 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
1abb0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1abc0 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
1abd0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1abe0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
1abf0 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
1ac00 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1ac10 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
1ac20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  pTab->pSelect ||
1ac30 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1ac40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
1ac50 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20  e reach here if 
1ac60 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
1ac70 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69  is a really a vi
1ac80 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ew */.        if
1ac90 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
1aca0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
1acb0 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75  se, pTab) ) retu
1acc0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1acd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
1ace0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
1acf0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
1ad00 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
1ad10 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
1ad20 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20   pTab->pSelect, 
1ad30 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1ad40 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
1ad50 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
1ad60 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  elect);.      }.
1ad70 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
1ad80 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
1ad90 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74  index named by t
1ada0 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
1adb0 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ause, if any. */
1adc0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1add0 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
1ade0 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
1adf0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
1ae00 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
1ae10 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
1ae20 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
1ae30 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
1ae40 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
1ae50 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
1ae60 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1ae70 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63  ed || sqliteProc
1ae80 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
1ae90 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
1aea0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
1aeb0 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
1aec0 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
1aed0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
1aee0 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
1aef0 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
1af00 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
1af10 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
1af20 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
1af30 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
1af40 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
1af50 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
1af60 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
1af70 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
1af80 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
1af90 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
1afa0 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
1afb0 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
1afc0 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
1afd0 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
1afe0 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
1aff0 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
1b000 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
1b010 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
1b020 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
1b030 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
1b040 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
1b050 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
1b060 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
1b070 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
1b080 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
1b090 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
1b0a0 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
1b0b0 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
1b0c0 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
1b0d0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
1b0e0 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
1b0f0 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
1b100 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1b110 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
1b120 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
1b130 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
1b140 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
1b150 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
1b160 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
1b170 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74  OT || (pE->pLeft
1b180 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  !=0 && pE->pLeft
1b190 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a  ->op==TK_ID) );.
1b1a0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
1b1b0 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
1b1c0 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
1b1d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1b1e0 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
1b1f0 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
1b200 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
1b210 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
1b220 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
1b230 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
1b240 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
1b250 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
1b260 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
1b270 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
1b280 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
1b290 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
1b2a0 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
1b2b0 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
1b2c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
1b2d0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1b2e0 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
1b2f0 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
1b300 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
1b310 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
1b320 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
1b330 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
1b340 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1b350 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
1b360 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
1b370 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
1b380 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
1b390 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
1b3a0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1b3b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
1b3c0 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
1b3d0 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
1b3e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b3f0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1b400 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
1b410 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
1b420 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70  op!=TK_ALL && (p
1b430 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1b440 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
1b450 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
1b460 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
1b470 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
1b480 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
1b490 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
1b4a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b4b0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1b4c0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1b4d0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
1b4e0 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
1b4f0 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
1b500 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
1b510 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
1b520 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
1b530 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
1b540 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
1b550 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
1b560 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
1b570 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
1b580 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
1b590 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
1b5a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1b5b0 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
1b5c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b5d0 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
1b5e0 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
1b5f0 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
1b600 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
1b610 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
1b620 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
1b630 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
1b640 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
1b650 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
1b660 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
1b670 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20   char *zTName;  
1b680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78            /* tex
1b690 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
1b6a0 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
1b6b0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
1b6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1b6d0 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21  sert( pE->pLeft!
1b6e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1b6f0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1b700 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65  Property(pE->pLe
1b710 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  ft, EP_IntValue)
1b720 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   );.          zT
1b730 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Name = pE->pLeft
1b740 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1b750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b760 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b       zTName = 0;
1b770 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b780 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
1b790 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
1b7a0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1b7b0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
1b7c0 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
1b7d0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
1b7e0 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63  Tab;.          c
1b7f0 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
1b800 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
1b810 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
1b820 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
1b830 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
1b840 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
1b850 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b860 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
1b870 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
1b880 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
1b890 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69  ( zTName && sqli
1b8a0 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
1b8b0 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20  e, zTabName)!=0 
1b8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
1b8d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1b8e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
1b8f0 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ableSeen = 1;.  
1b900 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1b910 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
1b920 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1b930 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70   Expr *pExpr, *p
1b940 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
1b950 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
1b960 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
1b970 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
1b980 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65    char *zColname
1b990 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74  ;  /* The comput
1b9a0 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ed column name *
1b9b0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  /.            ch
1b9c0 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f  ar *zToFree;   /
1b9d0 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e  * Malloced strin
1b9e0 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  g that needs to 
1b9f0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
1ba00 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43          Token sC
1ba10 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70  olname;  /* Comp
1ba20 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
1ba30 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a   as a token */..
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1ba50 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  f a column is ma
1ba60 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27  rked as 'hidden'
1ba70 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79   (currently only
1ba80 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
1ba90 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72        ** for vir
1baa0 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f  tual tables), do
1bab0 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20   not include it 
1bac0 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  in the expanded.
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
1bae0 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a  esult-set list..
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
1bb00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49             if( I
1bb10 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
1bb20 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b  Tab->aCol[j]) ){
1bb30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
1bb40 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28  ssert(IsVirtual(
1bb50 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20  pTab));.        
1bb60 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
1bb80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
1bb90 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20  >0 && zTName==0 
1bba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1bbb0 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69   if( (pFrom->joi
1bbc0 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
1bbd0 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  AL)!=0.         
1bbe0 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41         && tableA
1bbf0 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ndColumnIndex(pT
1bc00 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65  abList, i, zName
1bc10 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20  , 0, 0).        
1bc20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1bc30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
1bc40 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
1bc50 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
1bc60 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1bc80 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72  * table to the r
1bc90 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  ight of the join
1bca0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1bcb0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1bcc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1bce0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
1bcf0 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67  ex(pFrom->pUsing
1bd00 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bd20 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
1bd30 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
1bd40 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
1bd50 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
1bd60 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
1bd70 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
1bd80 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
1bd90 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1bda0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1bdc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1bdd0 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
1bde0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
1bdf0 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b  , TK_ID, zName);
1be00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
1be10 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  lname = zName;. 
1be20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
1be30 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ee = 0;.        
1be40 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
1be50 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
1be60 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
1be70 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
1be80 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
1be90 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
1bea0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
1beb0 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
1bec0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1bed0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1bee0 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
1bef0 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
1bf00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1bf10 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
1bf20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bf30 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69   zColname = sqli
1bf40 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1bf50 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
1bf60 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1bf70 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
1bf80 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  e = zColname;.  
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1bfa0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1bfb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1bfc0 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
1bfd0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1bfe0 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
1bff0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1c000 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
1c010 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
1c020 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65          sColname
1c030 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  .z = zColname;. 
1c040 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e             sColn
1c050 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53  ame.n = sqlite3S
1c060 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65  trlen30(zColname
1c070 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1c080 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
1c090 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
1c0a0 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
1c0b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1c0c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1c0d0 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
1c0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1c0f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
1c100 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
1c110 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
1c120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1c130 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1c140 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1c150 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
1c160 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
1c170 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c180 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c190 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
1c1a0 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
1c1b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c1c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c1d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1c1e0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1c1f0 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
1c200 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
1c210 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
1c220 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
1c230 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
1c240 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
1c250 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
1c260 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
1c270 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1c280 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1c290 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
1c2a0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
1c2b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1c2c0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1c2d0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
1c2e0 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
1c2f0 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
1c300 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
1c310 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1c320 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
1c330 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
1c340 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1c350 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
1c360 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
1c370 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
1c380 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
1c390 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
1c3a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1c3b0 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
1c3c0 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
1c3d0 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
1c3e0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1c3f0 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
1c400 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
1c410 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
1c420 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
1c430 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  er tree..*/.stat
1c440 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e  ic int exprWalkN
1c450 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
1c460 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73  sed, Expr *NotUs
1c470 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
1c480 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
1c490 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
1c4a0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1c4b0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nue;.}../*.** Th
1c4c0 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61  is routine "expa
1c4d0 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74  nds" a SELECT st
1c4e0 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20  atement and all 
1c4f0 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65  of its subquerie
1c500 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69  s..** For additi
1c510 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1c520 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e   on what it mean
1c530 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20  s to "expand" a 
1c540 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
1c550 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d  ent, see the com
1c560 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65  ment on the sele
1c570 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20  ctExpand worker 
1c580 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a  callback above..
1c590 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20  **.** Expanding 
1c5a0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1c5b0 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
1c5c0 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69  step in processi
1c5d0 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  ng a.** SELECT s
1c5e0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53  tatement.  The S
1c5f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1c600 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
1c610 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20   before.** name 
1c620 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65  resolution is pe
1c630 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  rformed..**.** I
1c640 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
1c650 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20  wrong, an error 
1c660 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
1c670 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a  en into pParse..
1c680 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
1c690 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65  unction can dete
1c6a0 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62  ct the problem b
1c6b0 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61  y looking at pPa
1c6c0 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64  rse->nErr.** and
1c6d0 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  /or pParse->db->
1c6e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f  mallocFailed..*/
1c6f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1c700 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
1c710 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c720 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
1c730 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
1c740 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
1c750 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64  k = selectExpand
1c760 65 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  er;.  w.xExprCal
1c770 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b  lback = exprWalk
1c780 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
1c790 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
1c7a0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
1c7b0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
1c7c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c7d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
1c7e0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
1c7f0 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
1c800 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
1c810 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
1c820 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
1c830 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
1c840 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
1c850 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
1c860 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
1c870 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
1c880 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
1c890 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
1c8a0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
1c8b0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
1c8c0 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
1c8d0 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
1c8e0 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
1c8f0 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
1c900 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
1c910 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
1c920 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
1c930 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
1c940 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
1c950 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
1c960 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
1c970 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
1c980 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
1c990 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
1c9a0 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
1c9b0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
1c9c0 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
1c9d0 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
1c9e0 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
1c9f0 63 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53  c int selectAddS
1ca00 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
1ca10 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1ca20 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
1ca30 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
1ca40 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
1ca50 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
1ca60 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1ca70 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
1ca80 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
1ca90 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
1caa0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
1cab0 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
1cac0 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20  eInfo)==0 ){.   
1cad0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
1cae0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
1caf0 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61      pParse = pWa
1cb00 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
1cb10 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1cb20 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSrc;.    for(i=
1cb30 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
1cb40 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
1cb50 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
1cb60 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62  om++){.      Tab
1cb70 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
1cb80 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ->pTab;.      if
1cb90 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30  ( ALWAYS(pTab!=0
1cba0 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  ) && (pTab->tabF
1cbb0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
1cbc0 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
1cbd0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
1cbe0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
1cbf0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1cc00 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
1cc10 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
1cc20 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
1cc30 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20     assert( pSel 
1cc40 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
1cc50 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
1cc60 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
1cc70 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65  rior;.        se
1cc80 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
1cc90 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
1cca0 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
1ccb0 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
1ccc0 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
1ccd0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1cce0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1ccf0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1cd00 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
1cd10 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
1cd20 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1cd30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
1cd40 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
1cd50 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
1cd60 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1cd70 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
1cd80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1cd90 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
1cda0 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
1cdb0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
1cdc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1cdd0 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
1cde0 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
1cdf0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
1ce00 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
1ce10 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1ce20 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
1ce30 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
1ce40 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ack = selectAddS
1ce50 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
1ce60 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
1ce70 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f  ck = exprWalkNoo
1ce80 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
1ce90 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
1cea0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
1ceb0 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
1cec0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1ced0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 6f 66 20  routine sets of 
1cee0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1cef0 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
1cf00 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
1cf10 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
1cf20 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
1cf30 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
1cf40 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
1cf50 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
1cf60 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
1cf70 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
1cf80 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
1cf90 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
1cfa0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
1cfb0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
1cfc0 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
1cfd0 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
1cfe0 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
1cff0 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
1d000 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
1d010 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
1d020 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
1d030 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
1d040 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
1d050 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
1d060 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
1d070 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
1d080 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
1d090 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
1d0a0 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
1d0b0 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
1d0c0 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
1d0d0 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
1d0e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1d0f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1d100 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1d110 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1d120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d130 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d140 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
1d150 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
1d160 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
1d170 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
1d180 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
1d190 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1d1a0 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
1d1b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
1d1c0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1d1d0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
1d1e0 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
1d1f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1d200 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1d210 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
1d220 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1d230 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1d240 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
1d250 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
1d260 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
1d270 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
1d280 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1d290 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1d2a0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1d2b0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
1d2c0 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
1d2d0 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
1d2e0 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
1d2f0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
1d300 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
1d310 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1d320 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
1d330 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
1d340 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
1d350 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
1d360 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
1d370 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
1d380 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d  s.** routine sim
1d390 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  ply stores NULLs
1d3a0 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
1d3b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a   memory cells..*
1d3c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
1d3d0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
1d3e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1d3f0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1d400 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1d410 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1d420 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
1d430 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
1d440 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
1d450 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
1d460 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
1d470 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1d480 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
1d490 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1d4a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1d4b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d4c0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
1d4d0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
1d4e0 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Mem);.  }.  for(
1d4f0 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
1d500 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
1d510 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1d520 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
1d530 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d540 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1d550 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b  0, pFunc->iMem);
1d560 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
1d570 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
1d580 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1d590 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
1d5a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1d5b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d5c0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1d5d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
1d5e0 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1d5f0 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
1d600 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
1d610 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1d620 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
1d630 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
1d640 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
1d650 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
1d660 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
1d670 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
1d680 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
1d690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d6a0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1d6b0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1d6c0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1d6d0 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20   pE->x.pList);. 
1d6e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1d6f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1d700 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
1d710 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
1d720 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d740 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
1d750 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
1d760 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
1d770 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1d780 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
1d790 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
1d7a0 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
1d7b0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
1d7c0 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
1d7d0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1d7e0 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
1d7f0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
1d800 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
1d810 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1d820 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d830 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1d840 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1d850 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
1d860 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
1d870 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1d880 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1d890 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
1d8a0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
1d8b0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
1d8c0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
1d8d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d8e0 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
1d8f0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1d900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d910 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1d920 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
1d930 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
1d940 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d960 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
1d970 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
1d980 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
1d990 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
1d9a0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
1d9b0 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
1d9c0 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
1d9d0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
1d9e0 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
1d9f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1da00 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
1da10 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1da20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1da30 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1da40 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1da50 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1da60 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1da70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
1da80 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
1da90 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
1daa0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 73 71 6c 69  Mode = 1;.  sqli
1dab0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
1dac0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
1dad0 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
1dae0 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
1daf0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
1db00 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
1db10 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
1db20 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
1db30 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20   int regAgg;.   
1db40 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1db50 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
1db60 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
1db70 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1db80 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
1db90 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1dba0 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
1dbb0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
1dbc0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1dbd0 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74    regAgg = sqlit
1dbe0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1dbf0 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20  Parse, nArg);.  
1dc00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1dc10 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
1dc20 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67  se, pList, regAg
1dc30 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g, 0);.    }else
1dc40 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
1dc50 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
1dc60 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1dc70 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
1dc80 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
1dc90 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
1dca0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1dcb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
1dcc0 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
1dcd0 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
1dce0 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
1dcf0 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
1dd00 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
1dd10 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
1dd20 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1dd30 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
1dd40 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
1dd50 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
1dd60 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1dd70 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1dd80 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1dd90 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
1dda0 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
1ddb0 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
1ddc0 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
1ddd0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
1dde0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
1ddf0 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
1de00 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
1de10 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1de20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1de30 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
1de40 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
1de50 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
1de60 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
1de70 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
1de80 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
1de90 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1dea0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1deb0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
1dec0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
1ded0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
1dee0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1def0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1df00 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72  OP_AggStep, 0, r
1df10 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c  egAgg, pF->iMem,
1df20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1df30 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
1df40 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
1df50 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
1df60 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1df70 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20   (u8)nArg);.    
1df80 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1df90 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1dfa0 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
1dfb0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
1dfc0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
1dfd0 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
1dfe0 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
1dff0 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
1e000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1e010 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1e020 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73  drNext);.      s
1e030 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
1e040 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
1e050 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65    }.  }..  /* Be
1e060 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  fore populating 
1e070 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
1e080 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72  registers, clear
1e090 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1e0a0 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  e..  ** Otherwis
1e0b0 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  e, if any of the
1e0c0 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e   required column
1e0d0 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65   values are alre
1e0e0 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a  ady present .  *
1e0f0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20  * in registers, 
1e100 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1e110 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f  ) may use OP_SCo
1e120 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76  py to copy the v
1e130 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d  alue.  ** to pC-
1e140 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68  >iMem. But by th
1e150 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65  e time the value
1e160 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72   is used, the or
1e170 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a  iginal register.
1e180 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65    ** may have be
1e190 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64  en used, invalid
1e1a0 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c  ating the underl
1e1b0 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64  ying buffer hold
1e1c0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78  ing the.  ** tex
1e1d0 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e  t or blob value.
1e1e0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33   See ticket [883
1e1f0 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20  034dcb5]..  **. 
1e200 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75   ** Another solu
1e210 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f  tion would be to
1e220 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53   change the OP_S
1e230 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70  Copy used to cop
1e240 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61  y cached.  ** va
1e250 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f  lues to an OP_Co
1e260 70 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  py..  */.  sqlit
1e270 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
1e280 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
1e290 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
1e2a0 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
1e2b0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
1e2c0 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
1e2d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1e2e0 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
1e2f0 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
1e300 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
1e310 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
1e320 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e330 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
1e340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1e350 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
1e360 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1e370 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20   given in the p 
1e380 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  argument.  .**.*
1e390 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
1e3a0 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  e distributed in
1e3b0 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65   various ways de
1e3c0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a  pending on the.*
1e3d0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1e3e0 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72  e SelectDest str
1e3f0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
1e400 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44  o by argument pD
1e410 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  est.** as follow
1e420 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65  s:.**.**     pDe
1e430 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73  st->eDest    Res
1e440 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
1e450 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
1e460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e480 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
1e490 54 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47 65  T_Output      Ge
1e4a0 6e 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20  nerate a row of 
1e4b0 6f 75 74 70 75 74 20 28 75 73 69 6e 67 20 74 68  output (using th
1e4c0 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a  e OP_ResultRow.*
1e4d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e4e0 20 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f        opcode) fo
1e4f0 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68  r each row in th
1e500 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a  e result set..**
1e510 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
1e520 20 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c          Only val
1e530 69 64 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  id if the result
1e540 20 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   is a single col
1e550 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  umn..**         
1e560 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72              Stor
1e570 65 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75  e the first colu
1e580 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  mn of the first 
1e590 72 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20  result row.**   
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 20 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44    in register pD
1e5c0 65 73 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20  est->iParm then 
1e5d0 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74  abandon the rest
1e5e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1e5f0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 71          of the q
1e600 75 65 72 79 2e 20 20 54 68 69 73 20 64 65 73 74  uery.  This dest
1e610 69 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  ination implies 
1e620 22 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a  "LIMIT 1"..**.**
1e630 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20       SRT_Set    
1e640 20 20 20 20 20 54 68 65 20 72 65 73 75 6c 74 20       The result 
1e650 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65  must be a single
1e660 20 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20   column.  Store 
1e670 65 61 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20  each.**         
1e680 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 20              row 
1e690 6f 66 20 72 65 73 75 6c 74 20 61 73 20 74 68 65  of result as the
1e6a0 20 6b 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44   key in table pD
1e6b0 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20  est->iParm. .** 
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6d0 20 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66      Apply the af
1e6e0 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66  finity pDest->af
1e6f0 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74  finity before st
1e700 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oring.**        
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
1e720 75 6c 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69  ults.  Used to i
1e730 6d 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45  mplement "IN (SE
1e740 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a  LECT ...)"..**.*
1e750 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20  *     SRT_Union 
1e760 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
1e770 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20  lts as a key in 
1e780 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1e790 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
1e7a0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
1e7b0 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
1e7c0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
1e7d0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1e7e0 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
1e7f0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
1e800 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
1e810 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
1e820 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
1e830 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20  ->iParm..**     
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54  This is like SRT
1e860 5f 45 70 68 65 6d 54 61 62 20 65 78 63 65 70 74  _EphemTab except
1e870 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a   that the table.
1e880 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e890 20 20 20 20 20 20 20 69 73 20 61 73 73 75 6d 65         is assume
1e8a0 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20  d to already be 
1e8b0 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  open..**.**     
1e8c0 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20  SRT_EphemTab    
1e8d0 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72  Create an tempor
1e8e0 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1e8f0 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65  >iParm and store
1e900 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1e910 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75          the resu
1e920 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20 63 75  lt there. The cu
1e930 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65  rsor is left ope
1e940 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20  n after.**      
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1e960 65 74 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20  eturning.  This 
1e970 69 73 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c  is like SRT_Tabl
1e980 65 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a  e except that.**
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9a0 20 20 20 20 20 74 68 69 73 20 64 65 73 74 69 6e       this destin
1e9b0 61 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70  ation uses OP_Op
1e9c0 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63  enEphemeral to c
1e9d0 72 65 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  reate.**        
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1e9f0 20 74 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a   table first..**
1ea00 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f  .**     SRT_Coro
1ea10 75 74 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65  utine   Generate
1ea20 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68   a co-routine th
1ea30 61 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77  at returns a new
1ea40 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20   row of.**      
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1ea60 65 73 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65  esults each time
1ea70 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20   it is invoked. 
1ea80 20 54 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74   The entry point
1ea90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1eaa0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
1eab0 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f  o-routine is sto
1eac0 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
1ead0 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1eae0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73  .**     SRT_Exis
1eaf0 74 73 20 20 20 20 20 20 53 74 6f 72 65 20 61 20  ts      Store a 
1eb00 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  1 in memory cell
1eb10 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66   pDest->iParm if
1eb20 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20   the result.**  
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d     set is not em
1eb50 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  pty..**.**     S
1eb60 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54  RT_Discard     T
1eb70 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73  hrow the results
1eb80 20 61 77 61 79 2e 20 20 54 68 69 73 20 69 73 20   away.  This is 
1eb90 75 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a  used by SELECT.*
1eba0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1ebb0 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73        statements
1ebc0 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
1ebd0 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70   whose only purp
1ebe0 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ose is.**       
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1ec00 65 20 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f  e side-effects o
1ec10 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a  f functions..**.
1ec20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ec30 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
1ec40 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
1ec50 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
1ec60 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
1ec70 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
1ec80 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
1ec90 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
1eca0 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
1ecb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ecc0 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
1ecd0 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
1ece0 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
1ecf0 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
1ed00 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
1ed10 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
1ed20 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
1ed30 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
1ed40 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
1ed50 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
1ed60 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1ed70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1ed80 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
1ed90 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
1eda0 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
1edb0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
1edc0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
1edd0 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
1ede0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
1edf0 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
1ee00 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1ee10 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
1ee20 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
1ee30 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
1ee40 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1ee50 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
1ee60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee70 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
1ee80 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
1ee90 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
1eea0 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
1eeb0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1eec0 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
1eed0 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
1eee0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1eef0 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
1ef00 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
1ef10 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
1ef20 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1ef30 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
1ef40 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
1ef50 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
1ef60 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
1ef70 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1ef80 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1ef90 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
1efa0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
1efb0 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
1efc0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1efd0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
1efe0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
1eff0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
1f000 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
1f010 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
1f020 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
1f030 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
1f040 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1f050 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
1f060 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
1f070 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1f080 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
1f090 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
1f0a0 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20    int distinct; 
1f0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1f0c0 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
1f0d0 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f   distinct set */
1f0e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
1f0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1f100 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
1f110 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
1f120 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72  */.  int addrSor
1f130 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41  tIndex;     /* A
1f140 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f  ddress of an OP_
1f150 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
1f160 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41  struction */.  A
1f170 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
1f180 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
1f190 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
1f1a0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
1f1b0 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
1f1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1f1d0 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
1f1e0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
1f1f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
1f200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f210 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1f220 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20  tion */..  db = 
1f230 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1f240 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
1f250 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
1f260 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
1f270 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1f280 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1f290 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1f2a0 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
1f2b0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
1f2c0 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
1f2d0 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
1f2e0 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20  (sAggInfo));..  
1f2f0 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
1f300 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
1f310 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d     assert(pDest-
1f320 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73  >eDest==SRT_Exis
1f330 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ts || pDest->eDe
1f340 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c  st==SRT_Union ||
1f350 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65   .           pDe
1f360 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
1f370 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e  xcept || pDest->
1f380 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
1f390 72 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f  rd);.    /* If O
1f3a0 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f  RDER BY makes no
1f3b0 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
1f3c0 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e  he output then n
1f3d0 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20  either does.    
1f3e0 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69  ** DISTINCT so i
1f3f0 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  t can be removed
1f400 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c   too. */.    sql
1f410 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1f420 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
1f430 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  By);.    p->pOrd
1f440 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
1f450 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
1f460 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20  _Distinct;.  }. 
1f470 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
1f480 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ep(pParse, p, 0)
1f490 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
1f4a0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54  ->pOrderBy;.  pT
1f4b0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1f4c0 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
1f4d0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50  pEList;.  if( pP
1f4e0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
1f4f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1f500 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
1f510 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41  t_end;.  }.  isA
1f520 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
1f530 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
1f540 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20  )!=0;.  assert( 
1f550 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
1f560 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
1f570 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
1f580 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1f590 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1f5a0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
1f5b0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
1f5c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1f5d0 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
1f5e0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
1f5f0 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21  lause.  */.#if !
1f600 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f610 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1f620 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1f630 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
1f640 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
1f650 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
1f660 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
1f670 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1f680 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1f690 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
1f6a0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
1f6b0 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
1f6c0 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
1f6d0 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69  elect;.    int i
1f6e0 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66  sAggSub;..    if
1f6f0 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 70 49 74  ( pSub==0 || pIt
1f700 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20  em->isPopulated 
1f710 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
1f720 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
1f730 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
1f740 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
1f750 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
1f760 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
1f770 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68  refered to by th
1f780 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
1f790 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
1f7a0 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
1f7b0 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
1f7c0 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
1f7d0 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
1f7e0 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
1f7f0 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
1f800 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
1f810 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
1f820 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
1f830 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
1f840 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
1f850 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
1f860 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
1f870 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
1f880 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
1f890 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
1f8a0 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
1f8b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
1f8c0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73   to see if the s
1f8d0 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61  ubquery can be a
1f8e0 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 74 68 65  bsorbed into the
1f8f0 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
1f900 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62  isAggSub = (pSub
1f910 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1f920 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
1f930 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
1f940 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
1f950 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67  , i, isAgg, isAg
1f960 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 69  gSub) ){.      i
1f970 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20  f( isAggSub ){. 
1f980 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31         isAgg = 1
1f990 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c  ;.        p->sel
1f9a0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72  Flags |= SF_Aggr
1f9b0 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20  egate;.      }. 
1f9c0 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20       i = -1;.   
1f9d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1f9e0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
1f9f0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45  nit(&dest, SRT_E
1fa00 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e  phemTab, pItem->
1fa10 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
1fa20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
1fa30 73 50 6f 70 75 6c 61 74 65 64 3d 3d 30 20 29 3b  sPopulated==0 );
1fa40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
1fa50 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
1fa60 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  b, &dest);.     
1fa70 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
1fa80 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
1fa90 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d     if( /*pParse-
1faa0 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d  >nErr ||*/ db->m
1fab0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1fac0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
1fad0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
1fae0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
1faf0 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  -= sqlite3Select
1fb00 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20  ExprHeight(p);. 
1fb10 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
1fb20 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21  >pSrc;.    if( !
1fb30 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
1fb40 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
1fb50 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
1fb60 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
1fb70 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d   }.  pEList = p-
1fb80 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a  >pEList;.#endif.
1fb90 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
1fba0 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
1fbb0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
1fbc0 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
1fbd0 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74  Having;.  isDist
1fbe0 69 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  inct = (p->selFl
1fbf0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1fc00 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t)!=0;..#ifndef 
1fc10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
1fc20 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
1fc30 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
1fc40 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
1fc50 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
1fc60 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
1fc70 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
1fc80 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
1fc90 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
1fca0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ==0 ){.      Sel
1fcb0 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69  ect *pLoop, *pRi
1fcc0 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ght = 0;.      i
1fcd0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
1fce0 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a    int mxSelect;.
1fcf0 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d        for(pLoop=
1fd00 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
1fd10 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63  pLoop->pPrior, c
1fd20 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  nt++){.        p
1fd30 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  Loop->pRightmost
1fd40 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c   = p;.        pL
1fd50 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69  oop->pNext = pRi
1fd60 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69  ght;.        pRi
1fd70 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  ght = pLoop;.   
1fd80 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c     }.      mxSel
1fd90 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  ect = db->aLimit
1fda0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
1fdb0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a  MPOUND_SELECT];.
1fdc0 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65        if( mxSele
1fdd0 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65  ct && cnt>mxSele
1fde0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
1fdf0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1fe00 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
1fe10 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e  terms in compoun
1fe20 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20  d SELECT");.    
1fe30 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1fe40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fe50 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
1fe60 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  ct(pParse, p, pD
1fe70 65 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  est);.  }.#endif
1fe80 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e  ..  /* If writin
1fe90 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67  g to memory or g
1fea0 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a  enerating a set.
1feb0 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67    ** only a sing
1fec0 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65  le column may be
1fed0 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69   output..  */.#i
1fee0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fef0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
1ff00 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
1ff10 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
1ff20 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70  pParse, pDest, p
1ff30 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
1ff40 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
1ff50 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
1ff60 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62  ..  /* If possib
1ff70 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68 65 20  le, rewrite the 
1ff80 71 75 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f  query to use GRO
1ff90 55 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66  UP BY instead of
1ffa0 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20   DISTINCT..  ** 
1ffb0 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75  GROUP BY might u
1ffc0 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53  se an index, DIS
1ffd0 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73  TINCT never does
1ffe0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1fff0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
20000 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
20010 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
20020 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  =0 );.  if( (p->
20030 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
20040 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
20050 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
20060 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47  nct ){.    p->pG
20070 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
20080 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
20090 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  p->pEList, 0);. 
200a0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
200b0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
200c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
200d0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
200e0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  isDistinct = 0;.
200f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
20100 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
20110 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
20120 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
20130 20 74 68 65 79 20 61 72 65 0a 20 20 2a 2a 20 69   they are.  ** i
20140 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 64  dentical, then d
20150 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52  isable the ORDER
20160 20 42 59 20 63 6c 61 75 73 65 20 73 69 6e 63 65   BY clause since
20170 20 74 68 65 20 47 52 4f 55 50 20 42 59 0a 20 20   the GROUP BY.  
20180 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  ** will cause el
20190 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
201a0 75 74 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ut in the correc
201b0 74 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69  t order.  This i
201c0 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69  s.  ** an optimi
201d0 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72  zation - the cor
201e0 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75  rect answer shou
201f0 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64  ld result regard
20200 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74  less..  ** Use t
20210 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  he SQLITE_GroupB
20220 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68  yOrder flag with
20230 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
20240 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20  _OPTIMIZER.  ** 
20250 74 6f 20 64 69 73 61 62 6c 65 20 74 68 69 73 20  to disable this 
20260 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
20270 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
20280 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  s..  */.  if( sq
20290 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
202a0 70 61 72 65 28 70 2d 3e 70 47 72 6f 75 70 42 79  pare(p->pGroupBy
202b0 2c 20 70 4f 72 64 65 72 42 79 29 3d 3d 30 0a 20  , pOrderBy)==0. 
202c0 20 20 20 20 20 20 20 20 26 26 20 28 64 62 2d 3e          && (db->
202d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 47  flags & SQLITE_G
202e0 72 6f 75 70 42 79 4f 72 64 65 72 29 3d 3d 30 20  roupByOrder)==0 
202f0 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20  ){.    pOrderBy 
20300 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
20310 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
20320 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
20330 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67  hen this sorting
20340 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68  .  ** index migh
20350 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75  t end up being u
20360 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
20370 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65  a can be .  ** e
20380 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d  xtracted in pre-
20390 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49  sorted order.  I
203a0 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
203b0 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  se, then the.  *
203c0 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  * OP_OpenEphemer
203d0 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
203e0 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74  ill be changed t
203f0 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
20400 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65  e.  ** we figure
20410 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
20420 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e  rting index is n
20430 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
20440 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20  addrSortIndex.  
20450 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ** variable is u
20460 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
20470 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  e that change.. 
20480 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
20490 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
204a0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
204b0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
204c0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
204d0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
204e0 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
204f0 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
20500 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
20510 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
20520 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64  2] = addrSortInd
20530 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
20540 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
20550 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
20560 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72               pOr
20580 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
20590 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
205a0 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205c0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
205d0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
205e0 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
205f0 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64  .    addrSortInd
20600 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
20610 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
20620 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
20630 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
20640 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
20650 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
20660 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
20670 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
20680 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20690 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
206a0 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
206b0 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  iParm, pEList->n
206c0 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
206d0 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
206e0 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
206f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20700 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75  abel(v);.  compu
20710 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
20720 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
20730 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20  );..  /* Open a 
20740 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
20750 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
20760 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
20770 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
20780 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
20790 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61  *pKeyInfo;.    a
207a0 73 73 65 72 74 28 20 69 73 41 67 67 20 7c 7c 20  ssert( isAgg || 
207b0 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20  pGroupBy );.    
207c0 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  distinct = pPars
207d0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
207e0 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
207f0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
20800 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  arse, p->pEList)
20810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
20820 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
20830 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73  enEphemeral, dis
20840 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
20850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20860 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
20870 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
20880 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
20890 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  se{.    distinct
208a0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
208b0 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e   Aggregate and n
208c0 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
208d0 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64  ries are handled
208e0 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a   differently */.
208f0 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
20900 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
20910 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
20920 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65  is for non-aggre
20930 67 61 74 65 20 71 75 65 72 69 65 73 0a 20 20 20  gate queries.   
20940 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   ** Begin the da
20950 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20  tabase scan.    
20960 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
20970 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
20980 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
20990 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72  st, pWhere, &pOr
209a0 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 69  derBy, 0);.    i
209b0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
209c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
209d0 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
209e0 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
209f0 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
20a00 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  rior OP_OpenEphe
20a10 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  meral .    ** in
20a20 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
20a30 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
20a40 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
20a50 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
20a60 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74  meral.    ** int
20a70 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20  o an OP_Noop..  
20a80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64    */.    if( add
20a90 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26  rSortIndex>=0 &&
20aa0 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
20ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20ac0 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
20ad0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20   addrSortIndex, 
20ae0 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  1);.      p->add
20af0 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
20b00 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
20b10 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
20b20 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20  d inner loop.   
20b30 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21   */.    assert(!
20b40 69 73 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 20  isDistinct);.   
20b50 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
20b60 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
20b70 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
20b80 42 79 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20  By, -1, pDest,. 
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ba0 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
20bb0 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  inue, pWInfo->iB
20bc0 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  reak);..    /* E
20bd0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
20be0 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
20bf0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  /.    sqlite3Whe
20c00 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
20c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
20c20 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63 65  his is the proce
20c30 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
20c40 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
20c50 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
20c60 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
20c70 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
20c80 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
20c90 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
20ca0 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
20cb0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
20cc0 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
20cd0 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
20ce0 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
20cf0 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
20d00 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
20d10 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
20d20 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
20d30 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
20d40 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
20d50 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
20d60 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
20d70 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d90 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
20da0 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
20db0 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
20dc0 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20de0 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
20df0 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
20e00 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
20e10 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
20e20 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
20e30 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
20e40 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
20e50 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
20e60 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
20e70 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
20e80 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
20e90 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
20ea0 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
20eb0 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
20ec0 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ECT */..    /* R
20ed0 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
20ee0 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
20ef0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
20f00 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
20f10 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
20f20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20f30 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
20f40 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
20f70 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
20f80 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
20f90 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
20fa0 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
20fb0 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
20fc0 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
20fd0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
20fe0 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
20ff0 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
21000 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
21010 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20    pItem->iAlias 
21020 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
21030 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42     for(k=pGroupB
21040 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  y->nExpr, pItem=
21050 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30  pGroupBy->a; k>0
21060 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
21070 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
21080 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
21090 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20    }.    }.. .   
210a0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
210b0 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
210c0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
210d0 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
210e0 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
210f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
21100 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
21110 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
21120 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
21130 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
21140 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
21150 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
21160 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
21170 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
21180 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
21190 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
211a0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
211b0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
211c0 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
211d0 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
211e0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
211f0 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
21200 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
21210 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
21220 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
21230 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
21240 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
21250 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
21260 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  r+1 : 0;.    sAg
21270 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
21280 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
21290 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
212a0 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
212b0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
212c0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
212d0 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64  gList(&sNC, pOrd
212e0 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
212f0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
21300 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
21310 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
21320 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
21330 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
21340 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
21350 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
21360 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21370 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
21380 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
21390 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
213a0 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46  erty(sAggInfo.aF
213b0 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  unc[i].pExpr, EP
213c0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
213d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
213e0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
213f0 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
21400 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e  unc[i].pExpr->x.
21410 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
21420 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
21430 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
21440 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
21450 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
21460 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
21470 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
21480 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
21490 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
214a0 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
214b0 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
214c0 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
214d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
214e0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
214f0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
21500 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
21510 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
21520 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
21530 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b  */.      int j1;
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21550 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
21560 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
21570 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
21580 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
21590 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
215a0 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
215b0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
215c0 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
215d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
215e0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
215f0 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
21600 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
21610 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
21620 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
21630 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
21640 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
21650 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
21660 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
21670 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
21680 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
21690 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
216a0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
216b0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
216c0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
216d0 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
216e0 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
216f0 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
21700 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
21710 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
21720 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* Retu
21730 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
21740 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
21750 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
21760 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
21770 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
21780 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
21790 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
217a0 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
217b0 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
217c0 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
217d0 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
217e0 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
217f0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
21800 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
21810 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70  fter all, the Op
21820 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
21830 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
21840 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
21850 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
21860 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
21870 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
21880 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
21890 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
218a0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
218b0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
218c0 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
218d0 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
218e0 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
218f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
21900 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20  enEphemeral, .  
21910 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
21920 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
21930 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
21940 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
21950 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
21960 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
21970 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20  HANDOFF);..     
21980 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
21990 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
219a0 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
219b0 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
219c0 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
219d0 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
219e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
219f0 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
21a00 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
21a10 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70  m;.      regOutp
21a20 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  utRow = ++pParse
21a30 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
21a40 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
21a50 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21a60 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67  el(v);.      reg
21a70 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  Reset = ++pParse
21a80 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
21a90 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
21aa0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
21ab0 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  );.      iAMem =
21ac0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
21ad0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
21ae0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
21af0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
21b00 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iBMem = pParse->
21b10 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
21b20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
21b30 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
21b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21b50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21b60 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72  nteger, 0, iAbor
21b70 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
21b80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
21b90 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22  lear abort flag"
21ba0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
21bb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21bc0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55  P_Integer, 0, iU
21bd0 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
21be0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21bf0 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c  indicate accumul
21c00 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 0a  ator empty"));..
21c10 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
21c20 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
21c30 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
21c40 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
21c50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
21c60 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
21c70 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
21c80 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
21c90 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
21ca0 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
21cb0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
21cc0 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
21cd0 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
21ce0 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
21cf0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
21d00 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
21d10 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
21d20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21d30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21d40 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
21d50 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
21d60 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
21d70 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
21d80 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
21d90 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
21da0 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20  &pGroupBy, 0);. 
21db0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
21dc0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
21dd0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
21de0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
21df0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
21e00 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20  timizer is able 
21e10 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  to deliver rows 
21e20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65  in group by orde
21e30 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  r so.        ** 
21e40 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  we do not have t
21e50 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f  o sort.  The OP_
21e60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61  OpenEphemeral ta
21e70 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ble will be.    
21e80 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64      ** cancelled
21e90 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77   later because w
21ea0 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
21eb0 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f  use the pKeyInfo
21ec0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
21ed0 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
21ee0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
21ef0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
21f00 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
21f10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  {.        /* Row
21f20 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74  s are coming out
21f30 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64   in undetermined
21f40 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65   order.  We have
21f50 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20   to push.       
21f60 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74   ** each row int
21f70 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
21f80 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  x, terminate the
21f90 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20   first loop,.   
21fa0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f       ** then loo
21fb0 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69  p over the sorti
21fc0 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65  ng index in orde
21fd0 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74  r to get the out
21fe0 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  put.        ** i
21ff0 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20  n sorted order. 
22000 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22010 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20    int regBase;. 
22020 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65         int regRe
22030 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  cord;.        in
22040 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t nCol;.        
22050 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20  int nGroupBy;.. 
22060 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
22070 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
22080 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  nGroupBy = pGrou
22090 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
220a0 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75      nCol = nGrou
220b0 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  pBy + 1;.       
220c0 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b   j = nGroupBy+1;
220d0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
220e0 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
220f0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
22100 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e        if( sAggIn
22110 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74  fo.aCol[i].iSort
22120 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
22130 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b             nCol+
22140 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  +;.            j
22150 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
22160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22170 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
22180 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
22190 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  pParse, nCol);. 
221a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
221b0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
221c0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
221d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
221e0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
221f0 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c  roupBy, regBase,
22200 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
22210 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22220 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73  , OP_Sequence, s
22230 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
22240 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75  dx,regBase+nGrou
22250 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  pBy);.        j 
22260 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20  = nGroupBy+1;.  
22270 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
22280 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
22290 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
222a0 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
222b0 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73  o_col *pCol = &s
222c0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b  AggInfo.aCol[i];
222d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
222e0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
222f0 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
22300 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20       int r1 = j 
22310 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  + regBase;.     
22320 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a         int r2;..
22330 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20 3d              r2 =
22340 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22350 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
22360 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22380 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43    pCol->pTab, pC
22390 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f  ol->iColumn, pCo
223a0 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a  l->iTable, r1);.
223b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
223c0 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20  r1!=r2 ){.      
223d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
223e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
223f0 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a  SCopy, r2, r1);.
22400 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22410 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
22420 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
22440 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
22450 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
22460 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
22470 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
22480 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
22490 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72  regBase, nCol, r
224a0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
224b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
224c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
224d0 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  sert, sAggInfo.s
224e0 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65  ortingIdx, regRe
224f0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
22500 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
22510 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
22520 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
22530 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
22540 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
22550 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b   regBase, nCol);
22560 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22570 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
22580 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22590 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
225a0 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  P_Sort, sAggInfo
225b0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
225c0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
225d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
225e0 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
225f0 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
22600 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
22610 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
22620 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
22630 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
22640 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
22650 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
22660 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
22670 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
22680 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
22690 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
226a0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
226b0 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
226c0 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
226d0 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
226e0 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
226f0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
22700 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
22710 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
22720 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
22730 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
22740 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
22750 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
22760 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22770 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
22780 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
22790 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
227a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
227b0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
227c0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
227d0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
227e0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
227f0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
22800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
22810 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
22820 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67  , OP_Column, sAg
22830 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
22840 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
22850 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22860 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
22870 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
22880 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22890 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
228a0 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
228b0 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
228c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
228d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
228e0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
228f0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
22900 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
22910 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
22940 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
22950 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71  );.      j1 = sq
22960 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
22970 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
22980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
22990 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b  (v, OP_Jump, j1+
229a0 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20  1, 0, j1+1);..  
229b0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
229c0 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
229d0 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
229e0 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
229f0 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69      ** Changes i
22a00 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
22a10 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
22a20 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
22a30 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
22a40 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
22a50 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
22a60 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
22a70 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
22a80 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
22a90 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
22aa0 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
22ab0 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
22ac0 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
22ad0 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
22ae0 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
22af0 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
22b00 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
22b10 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
22b20 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
22b30 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
22b40 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
22b50 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
22b60 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
22b70 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
22b80 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
22b90 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65  rse, iBMem, iAMe
22ba0 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
22bb0 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
22bc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22bd0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
22be0 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
22bf0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
22c00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
22c10 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29  utput one row"))
22c20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22c30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22c40 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  IfPos, iAbortFla
22c50 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  g, addrEnd);.   
22c60 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22c70 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20  v, "check abort 
22c80 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
22c90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22ca0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
22cb0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
22cc0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
22cd0 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
22ce0 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
22cf0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
22d00 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
22d10 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
22d20 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
22d30 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
22d40 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
22d50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
22d60 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
22d70 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75  (v, j1);.      u
22d80 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
22d90 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
22da0 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
22db0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22dc0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
22dd0 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
22de0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
22df0 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69  "indicate data i
22e00 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  n accumulator"))
22e10 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
22e20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
22e30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67    */.      if( g
22e40 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
22e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22e60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
22e70 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
22e80 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
22e90 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d  OfLoop);.      }
22ea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
22eb0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
22ec0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
22ed0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
22ee0 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
22ef0 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20  rtingIdx, 1);.  
22f00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
22f10 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
22f20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
22f30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
22f40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22f50 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
22f60 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
22f70 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
22f80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22f90 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72   "output final r
22fa0 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ow"));..      /*
22fb0 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73   Jump over the s
22fc0 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20  ubroutines.     
22fd0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
22fe0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22ff0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
23000 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  nd);..      /* G
23010 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
23020 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
23030 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
23040 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
23050 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
23060 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
23070 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
23080 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
23090 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
230a0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
230b0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
230c0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
230d0 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
230e0 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
230f0 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
23100 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
23110 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
23120 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
23130 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
23140 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
23150 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
23160 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
23170 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
23180 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
23190 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
231a0 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
231b0 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
231c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
231d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
231e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
231f0 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72  nteger, 1, iAbor
23200 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
23210 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
23220 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  et abort flag"))
23230 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
23240 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
23250 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
23260 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c  tRow);.      sql
23270 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
23280 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70  abel(v, addrOutp
23290 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64  utRow);.      ad
232a0 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
232b0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
232c0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
232d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
232e0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55  (v, OP_IfPos, iU
232f0 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70  seFlag, addrOutp
23300 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20  utRow+2);.      
23310 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
23320 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
23330 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
23340 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
23350 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23360 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
23370 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
23380 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
23390 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
233a0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
233b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
233c0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
233d0 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
233e0 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
233f0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
23400 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
23410 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
23420 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70  >pEList, 0, 0, p
23430 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
23450 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
23480 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
23490 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ort);.      sqli
234a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
234b0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
234c0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
234d0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
234e0 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
234f0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
23500 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
23510 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
23520 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
23530 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
23540 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
23550 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
23560 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
23570 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29  el(v, addrReset)
23580 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
23590 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
235a0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
235b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
235c0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
235d0 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20  n, regReset);.  
235e0 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
235f0 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65  if pGroupBy.  Be
23600 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75  gin aggregate qu
23610 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52  eries without GR
23620 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65  OUP BY: */.    e
23630 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72  lse {.      Expr
23640 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  List *pDel = 0;.
23650 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23660 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20  MIT_BTREECOUNT. 
23670 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
23680 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  ;.      if( (pTa
23690 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e  b = isSimpleCoun
236a0 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29  t(p, &sAggInfo))
236b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
236c0 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75  * If isSimpleCou
236d0 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70  nt() returns a p
236e0 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c  ointer to a Tabl
236f0 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  e structure, the
23700 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
23710 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
23720 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
23730 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
23740 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f    **   SELECT co
23750 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
23760 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  >.        **.   
23770 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68       ** where th
23780 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
23790 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65  e returned repre
237a0 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c  sents table <tbl
237b0 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  >..        **.  
237c0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74        ** This st
237d0 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f  atement is so co
237e0 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20  mmon that it is 
237f0 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61  optimized specia
23800 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20  lly. The.       
23810 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73   ** OP_Count ins
23820 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63  truction is exec
23830 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74  uted either on t
23840 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20  he intkey table 
23850 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
23860 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
23870 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c  a for table <tbl
23880 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69  > or on one of i
23890 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20  ts indexes. It. 
238a0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74         ** is bet
238b0 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74  ter to execute t
238c0 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65  he op on an inde
238d0 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72  x, as indexes ar
238e0 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20  e almost.       
238f0 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61   ** always sprea
23900 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61  d across less pa
23910 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63  ges than their c
23920 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
23930 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  les..        */.
23940 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
23950 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
23960 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
23970 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
23980 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
23990 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20   const int iCsr 
239a0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
239b0 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ;     /* Cursor 
239c0 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a  to scan b-tree *
239d0 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
239e0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a00 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
23a10 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b  ble */.        K
23a20 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
23a30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23a40 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66      /* Keyinfo f
23a50 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78  or scanned index
23a60 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
23a70 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20  x *pBest = 0;   
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66   /* Best index f
23aa0 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ound so far */. 
23ab0 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74         int iRoot
23ac0 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20   = pTab->tnum;  
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23ae0 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e  oot page of scan
23af0 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20  ned b-tree */.. 
23b00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
23b10 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
23b20 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
23b30 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
23b40 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
23b50 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
23b60 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
23b70 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
23b80 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ch for the index
23b90 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 65   that has the le
23ba0 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66 20 63 6f  ast amount of co
23bb0 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20 20 20 20  lumns. If.      
23bc0 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 73 75    ** there is su
23bd0 63 68 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64  ch an index, and
23be0 20 69 74 20 68 61 73 20 6c 65 73 73 20 63 6f 6c   it has less col
23bf0 75 6d 6e 73 20 74 68 61 6e 20 74 68 65 20 74 61  umns than the ta
23c00 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  ble.        ** d
23c10 6f 65 73 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  oes, then we can
23c20 20 61 73 73 75 6d 65 20 74 68 61 74 20 69 74 20   assume that it 
23c30 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73 20 73 70  consumes less sp
23c40 61 63 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 0a  ace on disk and.
23c50 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20          ** will 
23c60 74 68 65 72 65 66 6f 72 65 20 62 65 20 63 68 65  therefore be che
23c70 61 70 65 72 20 74 6f 20 73 63 61 6e 20 74 6f 20  aper to scan to 
23c80 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 71 75  determine the qu
23c90 65 72 79 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ery result..    
23ca0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
23cb0 61 73 65 20 73 65 74 20 69 52 6f 6f 74 20 74 6f  ase set iRoot to
23cc0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
23cd0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
23ce0 65 78 20 62 2d 74 72 65 65 0a 20 20 20 20 20 20  ex b-tree.      
23cf0 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79 49 6e 66    ** and pKeyInf
23d00 6f 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f  o to the KeyInfo
23d10 20 73 74 72 75 63 74 75 72 65 20 72 65 71 75 69   structure requi
23d20 72 65 64 20 74 6f 20 6e 61 76 69 67 61 74 65 20  red to navigate 
23d30 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
23d40 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
23d50 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70  .        ** In p
23d60 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49  ractice the KeyI
23d70 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69  nfo structure wi
23d80 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
23d90 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20  It is only .    
23da0 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f      ** passed to
23db0 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61   keep OP_OpenRea
23dc0 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20  d happy..       
23dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
23de0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
23df0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
23e00 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
23e10 20 20 20 20 20 20 69 66 28 20 21 70 42 65 73 74        if( !pBest
23e20 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   || pIdx->nColum
23e30 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e  n<pBest->nColumn
23e40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23e50 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
23e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23e70 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
23e80 70 42 65 73 74 20 26 26 20 70 42 65 73 74 2d 3e  pBest && pBest->
23e90 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43  nColumn<pTab->nC
23ea0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
23eb0 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74  iRoot = pBest->t
23ec0 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  num;.          p
23ed0 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
23ee0 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
23ef0 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20  arse, pBest);.  
23f00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
23f10 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d   /* Open a read-
23f20 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65  only cursor, exe
23f30 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e  cute the OP_Coun
23f40 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72  t, close the cur
23f50 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  sor. */.        
23f60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23f70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
23f80 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69  , iCsr, iRoot, i
23f90 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Db);.        if(
23fa0 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
23fb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23fc0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
23fd0 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e  , (char *)pKeyIn
23fe0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
23ff0 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20  ANDOFF);.       
24000 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
24010 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24020 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20  OP_Count, iCsr, 
24030 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
24040 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
24050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24060 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
24070 69 43 73 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  iCsr);.      }el
24080 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
24090 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
240a0 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  UNT */.      {. 
240b0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
240c0 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
240d0 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
240e0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
240f0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
24100 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
24110 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
24120 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
24130 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
24140 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
24150 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
24160 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
24170 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
24180 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
24190 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
241a0 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
241b0 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
241c0 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
241d0 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
241e0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  . .        ** If
241f0 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
24200 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
24210 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
24220 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
24230 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64         ** add vd
24240 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
24250 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
24260 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
24270 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
24280 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
24290 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
242a0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
242b0 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
242c0 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
242d0 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
242e0 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
242f0 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
24300 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a  imum .        **
24310 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
24320 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
24330 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ed)..        **.
24340 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65          ** A spe
24350 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
24360 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
24370 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
24380 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
24390 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
243a0 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f  haviour as follo
243b0 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ws:.        **. 
243c0 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66         **   + If
243d0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
243e0 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c  "SELECT min(x)",
243f0 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63   then the loop c
24400 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20  oded by.        
24410 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
24420 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
24430 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
24440 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
24450 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  lue.        **  
24460 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20     for x..      
24470 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
24480 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65    + The optimize
24490 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  r code in where.
244a0 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  c (the thing tha
244b0 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a  t decides which.
244c0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
244d0 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20  ndex or indices 
244e0 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70  to use) should p
244f0 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
24500 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20   priority on .  
24510 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74        **     sat
24520 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44  isfying the 'ORD
24530 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68  ER BY' clause th
24540 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74  an it does in ot
24550 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20  her cases..     
24560 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
24570 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
24580 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
24590 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
245a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
245b0 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
245c0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  x = 0;.        u
245d0 38 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51  8 flag = minMaxQ
245e0 75 65 72 79 28 70 29 3b 0a 20 20 20 20 20 20 20  uery(p);.       
245f0 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
24600 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
24610 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
24620 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
24630 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
24640 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
24650 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69    pMinMax = sqli
24660 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
24670 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  b, p->pEList->a[
24680 30 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  0].pExpr->x.pLis
24690 74 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t,0);.          
246a0 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a  pDel = pMinMax;.
246b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
246c0 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61  inMax && !db->ma
246d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
246e0 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
246f0 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  x->a[0].sortOrde
24700 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f  r = flag!=WHERE_
24710 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30  ORDERBY_MIN ?1:0
24720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
24730 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70  inMax->a[0].pExp
24740 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
24750 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  N;.          }. 
24760 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
24770 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
24780 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
24790 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
247a0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
247b0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
247c0 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
247d0 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
247e0 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
247f0 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
24800 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
24810 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
24820 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
24830 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
24840 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
24850 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
24860 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
24870 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
24880 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20  here, &pMinMax, 
24890 66 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20 69  flag);.        i
248a0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
248b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
248c0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
248d0 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
248e0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
248f0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
24900 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
24910 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
24920 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
24930 20 20 20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d        if( !pMinM
24940 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a 20 20  ax && flag ){.  
24950 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24960 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24970 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d  Goto, 0, pWInfo-
24980 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20  >iBreak);.      
24990 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
249a0 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
249b0 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
249c0 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52       (flag==WHER
249d0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
249e0 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
249f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24a00 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
24a10 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
24a20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
24a30 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
24a40 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
24a50 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  }..      pOrderB
24a60 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  y = 0;.      sql
24a70 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
24a80 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
24a90 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45   addrEnd, SQLITE
24aa0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
24ab0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
24ac0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
24ad0 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
24ae0 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  0, -1, .        
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
24b00 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  est, addrEnd, ad
24b10 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71  drEnd);.      sq
24b20 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
24b30 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
24b40 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24b50 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
24b60 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
24b70 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
24b80 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
24b90 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  */..  /* If ther
24ba0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
24bb0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
24bc0 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
24bd0 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
24be0 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
24bf0 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
24c00 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
24c10 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
24c20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
24c30 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
24c40 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
24c50 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
24c60 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
24c70 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
24c80 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
24c90 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
24ca0 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
24cb0 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
24cc0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
24cd0 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
24ce0 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
24cf0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
24d00 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
24d10 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
24d20 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
24d30 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
24d40 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
24d50 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
24d60 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
24d70 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
24d80 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
24d90 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e  _end:..  /* Iden
24da0 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
24db0 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20  s if results of 
24dc0 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74  the SELECT are t
24dd0 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  o be output..  *
24de0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
24df0 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e  TE_OK && pDest->
24e00 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
24e10 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
24e20 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
24e30 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
24e40 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
24e50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
24e60 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
24e70 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
24e80 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
24e90 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
24ea0 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
24eb0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
24ec0 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
24ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f10 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
24f20 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64  ing code is used
24f30 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
24f40 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
24f50 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68    The code.** th
24f60 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20  at follows does 
24f70 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f  not appear in no
24f80 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a  rmal builds..**.
24f90 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
24fa0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72  s are used to pr
24fb0 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74  int out the cont
24fc0 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61  ent of all or pa
24fd0 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73  rt of a .** pars
24fe0 65 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63  e structures suc
24ff0 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45  h as Select or E
25000 78 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74  xpr.  Such print
25010 6f 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a  outs are useful.
25020 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74  ** for helping t
25030 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61  o understand wha
25040 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69  t is happening i
25050 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67  nside the code g
25060 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69  enerator.** duri
25070 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  ng the execution
25080 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45   of complex SELE
25090 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
250a0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
250b0 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65  ne are not calle
250c0 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20  d anywhere from 
250d0 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61  within the norma
250e0 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20  l.** code base. 
250f0 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64   Then are intend
25100 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
25110 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
25120 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66  debugger.** or f
25130 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70  rom temporary "p
25140 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74  rintf" statement
25150 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64  s inserted for d
25160 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  ebugging..*/.voi
25170 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
25180 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  pr(Expr *p){.  i
25190 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
251a0 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
251b0 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
251c0 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
251d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25  3DebugPrintf("(%
251e0 73 22 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  s", p->u.zToken)
251f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
25200 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25210 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b  f("(%d", p->op);
25220 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c  .  }.  if( p->pL
25230 65 66 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eft ){.    sqlit
25240 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
25250 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
25260 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65 66  rintExpr(p->pLef
25270 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  t);.  }.  if( p-
25280 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73  >pRight ){.    s
25290 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
252a0 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  f(" ");.    sqli
252b0 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
252c0 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73  pRight);.  }.  s
252d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
252e0 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73  f(")");.}.void s
252f0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
25300 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ist(ExprList *pL
25310 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
25320 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
25330 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
25340 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
25350 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Expr(pList->a[i]
25360 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
25370 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d   i<pList->nExpr-
25380 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
25390 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c  e3DebugPrintf(",
253a0 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   ");.    }.  }.}
253b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
253c0 6e 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  ntSelect(Select 
253d0 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b  *p, int indent){
253e0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
253f0 72 69 6e 74 66 28 22 25 2a 73 53 45 4c 45 43 54  rintf("%*sSELECT
25400 28 25 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20  (%p) ", indent, 
25410 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  "", p);.  sqlite
25420 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70  3PrintExprList(p
25430 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ->pEList);.  sql
25440 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25450 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e  "\n");.  if( p->
25460 70 53 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72  pSrc ){.    char
25470 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20 20 20 69   *zPrefix;.    i
25480 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72 65 66 69  nt i;.    zPrefi
25490 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20  x = "FROM";.    
254a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53  for(i=0; i<p->pS
254b0 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
254c0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
254d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
254e0 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   = &p->pSrc->a[i
254f0 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
25500 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
25510 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50   ", indent+6, zP
25520 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7a 50  refix);.      zP
25530 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20  refix = "";.    
25540 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
25550 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
25560 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25570 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20  tf("(\n");.     
25580 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53     sqlite3PrintS
25590 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e 70 53 65  elect(pItem->pSe
255a0 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29  lect, indent+10)
255b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
255c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
255d0 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22  s)", indent+8, "
255e0 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
255f0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
25600 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25610 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
25620 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  %s", pItem->zNam
25630 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
25640 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61    if( pItem->pTa
25650 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
25660 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25670 22 28 74 61 62 6c 65 3a 20 25 73 29 22 2c 20 70  "(table: %s)", p
25680 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
25690 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
256a0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
256b0 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ias ){.        s
256c0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
256d0 66 28 22 20 41 53 20 25 73 22 2c 20 70 49 74 65  f(" AS %s", pIte
256e0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
256f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
25700 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20  p->pSrc->nSrc-1 
25710 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25720 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c  e3DebugPrintf(",
25730 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
25740 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25750 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
25760 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  }.  }.  if( p->p
25770 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c  Where ){.    sql
25780 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25790 22 25 2a 73 20 57 48 45 52 45 20 22 2c 20 69 6e  "%*s WHERE ", in
257a0 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
257b0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
257c0 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
257d0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
257e0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
257f0 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
25800 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
25810 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 47  bugPrintf("%*s G
25820 52 4f 55 50 20 42 59 20 22 2c 20 69 6e 64 65 6e  ROUP BY ", inden
25830 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
25840 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74  te3PrintExprList
25850 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  (p->pGroupBy);. 
25860 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25870 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
25880 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e  .  if( p->pHavin
25890 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
258a0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
258b0 20 48 41 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e   HAVING ", inden
258c0 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69  t, "");.    sqli
258d0 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
258e0 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71  pHaving);.    sq
258f0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25900 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
25910 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
25920 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
25930 67 50 72 69 6e 74 66 28 22 25 2a 73 20 4f 52 44  gPrintf("%*s ORD
25940 45 52 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c  ER BY ", indent,
25950 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
25960 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70  3PrintExprList(p
25970 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
25980 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25990 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d  ntf("\n");.  }.}
259a0 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  ./* End of the s
259b0 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70  tructure debug p
259c0 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a  rinting code.***
259d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
259e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
259f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
25a20 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
25a30 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
25a40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
25a50 55 47 29 20 2a 2f 0a                             UG) */.