/ Hex Artifact Content
Login

Artifact a03ec6a313ef8311f081ee478f96ae04ff691608:


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 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3ba0: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
3bb0: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
3bc0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
3bd0: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
3be0: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
3bf0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
3c00: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53  o this VM */.  S
3c10: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
3c20: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
3c30: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
3c40: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oded */.  int iC
3c50: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
3c60: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
3c70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
3c80: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
3c90: 70 2d 3e 69 4f 66 66 73 65 74 20 26 26 20 69 43  p->iOffset && iC
3ca0: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20  ontinue!=0 ){.  
3cb0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
3cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3cd0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
3ce0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b  p->iOffset, -1);
3cf0: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
3d00: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3d10: 20 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f   OP_IfNeg, p->iO
3d20: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
3d30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3d40: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f   OP_Goto, 0, iCo
3d50: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62  ntinue);.    Vdb
3d60: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b  eComment((v, "sk
3d70: 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64  ip OFFSET record
3d80: 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s"));.    sqlite
3d90: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3da0: 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   addr);.  }.}../
3db0: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68  *.** Add code th
3dc0: 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f  at will check to
3dd0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e   make sure the N
3de0: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
3df0: 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66  ing at iMem.** f
3e00: 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65  orm a distinct e
3e10: 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61  ntry.  iTab is a
3e20: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
3e30: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
3e40: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
3e50: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
3e60: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
3e70: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
3e80: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
3e90: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
3ea0: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
3eb0: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
3ec0: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
3ed0: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
3ee0: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
3ef0: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
3f00: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
3f10: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
3f20: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
3f30: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
3f40: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
3f50: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
3f60: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
3f70: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
3f80: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
3f90: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
3fa0: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
3fb0: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
3fc0: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
3fd0: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
3fe0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
3ff0: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
4000: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
4010: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4020: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a  er of elements *
4030: 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20  /.  int iMem    
4040: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4050: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
4060: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72  Vdbe *v;.  int r
4070: 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  1;..  v = pParse
4080: 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20  ->pVdbe;.  r1 = 
4090: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
40a0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
40b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
40c0: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
40d0: 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c  Tab, addrRepeat,
40e0: 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c   iMem, N);.  sql
40f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4100: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4110: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
4120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4130: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
4140: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
4150: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
4160: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
4170: 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
4180: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4190: 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
41a0: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
41b0: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
41c0: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
41d0: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
41e0: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
41f0: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
4200: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
4210: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
4220: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
4230: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
4240: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
4250: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
4260: 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75  ror used to occu
4270: 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65  r.** in multiple
4280: 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65   places.  (The e
4290: 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73  rror only occurs
42a0: 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f   in one place no
42b0: 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74  w, but we.** ret
42c0: 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69  ain the subrouti
42d0: 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63  ne to minimize c
42e0: 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29  ode disruption.)
42f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
4300: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
4310: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20  mnSelectError(. 
4320: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4330: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
4340: 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c  ontext. */.  Sel
4350: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
4360: 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
4370: 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c   of SELECT resul
4380: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70  ts */.  int nExp
4390: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
43a0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
43b0: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
43c0: 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29  d by SELECT */.)
43d0: 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  {.  int eDest = 
43e0: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
43f0: 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28  if( nExpr>1 && (
4400: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
4410: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
4420: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4430: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4440: 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
4450: 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
4460: 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
4470: 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
4480: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
4490: 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ion");.    retur
44a0: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
44b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
44c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
44d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
44e0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
44f0: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
4500: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
4510: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
4520: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
4530: 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65   and nColumn are
4540: 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e   both zero, then
4550: 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72   the pEList expr
4560: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65  essions.** are e
4570: 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65  valuated in orde
4580: 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74  r to get the dat
4590: 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20  a for this row. 
45a0: 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a   If nColumn>0.**
45b0: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
45c0: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
45d0: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
45e0: 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20  sed only to get 
45f0: 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73  the.** datatypes
4600: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
4610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4620: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
4630: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4640: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
4650: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
4660: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
4670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4680: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
4690: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
46a0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
46b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
46c0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
46d0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
46e0: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
46f0: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
4700: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
4710: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
4720: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
4730: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
4740: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4750: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
4760: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
4770: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
4780: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
4790: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
47a0: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
47b0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
47c0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
47d0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
47e0: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
47f0: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
4800: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
4810: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
4820: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
4830: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4840: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
4850: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4860: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4870: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
4880: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
4890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
48a0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
48b0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
48c0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
48d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
48e0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
48f0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
4900: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
4910: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
4920: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
4930: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
4940: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4950: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4960: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
4970: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
4980: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4990: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
49a0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
49b0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
49c0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
49d0: 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20 46 69  ->iParm;   /* Fi
49e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
49f0: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
4a00: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
4a10: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4a20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4a30: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
4a40: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
4a50: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
4a60: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  ) ) return;.  as
4a70: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4a80: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4a90: 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 3b 0a   = distinct>=0;.
4aa0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4ab0: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
4ac0: 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66  t ){.    codeOff
4ad0: 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
4ae0: 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nue);.  }..  /* 
4af0: 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  Pull the request
4b00: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f  ed columns..  */
4b10: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
4b20: 20 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43   ){.    nResultC
4b30: 6f 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ol = nColumn;.  
4b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75  }else{.    nResu
4b50: 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  ltCol = pEList->
4b60: 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28  nExpr;.  }.  if(
4b70: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20   pDest->iMem==0 
4b80: 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 4d  ){.    pDest->iM
4b90: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
4ba0: 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  m+1;.    pDest->
4bb0: 6e 4d 65 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f  nMem = nResultCo
4bc0: 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  l;.    pParse->n
4bd0: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
4be0: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20  l;.  }else{ .   
4bf0: 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
4c00: 6e 4d 65 6d 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c  nMem==nResultCol
4c10: 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73   );.  }.  regRes
4c20: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 4d 65  ult = pDest->iMe
4c30: 6d 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  m;.  if( nColumn
4c40: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4c50: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4c60: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4c70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4c80: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4c90: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
4ca0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
4cb0: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
4cc0: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
4cd0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
4ce0: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
4cf0: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
4d00: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
4d10: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
4d20: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
4d30: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
4d40: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
4d50: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
4d60: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
4d70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4d80: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4d90: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
4da0: 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f  ult, eDest==SRT_
4db0: 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e  Output);.  }.  n
4dc0: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
4dd0: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
4de0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
4df0: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
4e00: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
4e10: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
4e20: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
4e30: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
4e40: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
4e50: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
4e60: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
4e70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
4e80: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
4e90: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
4ea0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
4eb0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
4ec0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63  nColumn );.    c
4ed0: 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
4ee0: 73 65 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43  se, distinct, iC
4ef0: 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e  ontinue, nColumn
4f00: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
4f10: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4f20: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
4f30: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
4f40: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
4f50: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
4f60: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
4f70: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
4f80: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
4f90: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
4fa0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
4fb0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
4fc0: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
4fd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
4fe0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
4ff0: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
5000: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
5010: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
5020: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5030: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
5040: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5050: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5060: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5070: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
5080: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5090: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
50a0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
50b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
50c0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
50d0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
50e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
50f0: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
5100: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
5110: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
5120: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
5130: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
5140: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
5150: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
5160: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
5170: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
5180: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
5190: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
51a0: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
51b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
51d0: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
51e0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
51f0: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
5200: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
5210: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
5220: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
5230: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
5240: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
5250: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
5260: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
5270: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
5280: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5290: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
52a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
52b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
52c0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
52d0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
52e0: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
52f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5300: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
5310: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
5320: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
5330: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
5340: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
5350: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5360: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5370: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , r1);.      }el
5380: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
5390: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
53a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
53b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
53c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
53d0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
53e0: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
53f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5400: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
5410: 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
5420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5430: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
5440: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
5450: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5460: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5470: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
5480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
5490: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
54a0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
54b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
54c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
54d0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
54e0: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
54f0: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
5500: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
5510: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
5520: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
5530: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
5540: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
5550: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
5560: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
5570: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
5580: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
5590: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
55a0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
55b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
55c0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
55d0: 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20      p->affinity 
55e0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
55f0: 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d  Affinity(pEList-
5600: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
5610: 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20  st->affinity);. 
5620: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5630: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
5640: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
5650: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
5660: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
5670: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
5680: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
5690: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
56a0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
56b0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
56c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
56d0: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
56e0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
56f0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
5700: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
5710: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
5720: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
5730: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
5740: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5750: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5760: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
5770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5780: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
5790: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
57a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
57b0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
57c0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
57d0: 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31  regResult, 1, r1
57e0: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
57f0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5800: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
5810: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
5820: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29  e, regResult, 1)
5830: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5840: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5850: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
5860: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  rm, r1);.       
5870: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5880: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5890: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
58a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
58b0: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
58c0: 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
58d0: 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
58e0: 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
58f0: 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
5900: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
5910: 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
5920: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5930: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
5940: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
5950: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
5960: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
5970: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
5980: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
5990: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
59a0: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
59b0: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
59c0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
59d0: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
59e0: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
59f0: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
5a00: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
5a10: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
5a20: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
5a30: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
5a40: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
5a50: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
5a60: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
5a70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
5a80: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5a90: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5aa0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5ab0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
5ac0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5ae0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
5af0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61  , regResult, iPa
5b00: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rm, 1);.        
5b10: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
5b20: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
5b30: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
5b40: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
5b50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5b60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
5b70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5b80: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
5b90: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
5ba0: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
5bb0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74  ck function or t
5bc0: 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  o a subroutine. 
5bd0: 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   In the.    ** c
5be0: 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ase of a subrout
5bf0: 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ine, the subrout
5c00: 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65  ine itself is re
5c10: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20  sponsible for.  
5c20: 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65    ** popping the
5c30: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
5c40: 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tack..    */.   
5c50: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
5c60: 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ine:.    case SR
5c70: 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20 20  T_Output: {.    
5c80: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
5c90: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
5ca0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
5cb0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
5cc0: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69  utput );.      i
5cd0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
5ce0: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
5cf0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5d00: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5d10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5d20: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
5d30: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
5d40: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
5d50: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5d60: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
5d70: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b  OrderBy, p, r1);
5d80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5d90: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5da0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5db0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
5dc0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
5dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5de0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5df0: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
5e00: 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
5e10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5e20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5e30: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
5e40: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5e50: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
5e60: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
5e70: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
5e80: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
5e90: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
5ea0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5eb0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
5ec0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5ed0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
5ee0: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
5ef0: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
5f00: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
5f10: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
5f20: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
5f30: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
5f40: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
5f50: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
5f60: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
5f70: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
5f80: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
5f90: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
5fa0: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
5fb0: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
5fc0: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
5fd0: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
5fe0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
5ff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
6000: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
6010: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
6020: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
6030: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
6040: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6050: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
6060: 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45  T is reached.  E
6070: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
6080: 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72  here is a sorter
6090: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
60a0: 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61  the sorter has a
60b0: 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20  lready limited. 
60c0: 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66   ** the output f
60d0: 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  or us..  */.  if
60e0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
60f0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
6100: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6110: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op3(v, OP_IfZero
6120: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
6130: 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 7d 0a  eak, -1);.  }.}.
6140: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
6150: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
6160: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
6170: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
6180: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
6190: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
61a0: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
61b0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
61c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
61d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
61e0: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
61f0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
6200: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
6210: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
6220: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6230: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
6240: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
6250: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
6260: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
6270: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
6280: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
6290: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
62a0: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
62b0: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
62c0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
62d0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
62e0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
62f0: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
6300: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
6310: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
6320: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
6330: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
6340: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
6350: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
6360: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
6370: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
6380: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
6390: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
63a0: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
63b0: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64  ly.** freed.  Ad
63c0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
63d0: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50  ructure to the P
63e0: 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70  4 field of an op
63f0: 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34  code using.** P4
6400: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
6410: 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61   is the usual wa
6420: 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74  y of dealing wit
6430: 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  h this..*/.stati
6440: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
6450: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50  foFromExprList(P
6460: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
6470: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
6480: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6490: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
64a0: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
64b0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
64c0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
64d0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
64e0: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
64f0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
6500: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
6510: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
6520: 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e  zeof(*pInfo) + n
6530: 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  Expr*(sizeof(Col
6540: 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69  lSeq*)+1) );.  i
6550: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
6560: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
6570: 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d  r = (u8*)&pInfo-
6580: 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20  >aColl[nExpr];. 
6590: 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64     pInfo->nField
65a0: 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20   = (u16)nExpr;. 
65b0: 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20     pInfo->enc = 
65c0: 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 49 6e  ENC(db);.    pIn
65d0: 66 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  fo->db = db;.   
65e0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
65f0: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
6600: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
6610: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
6620: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
6630: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
6640: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
6650: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
6660: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
6670: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
6680: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
6690: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
66a0: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
66b0: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
66c0: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
66d0: 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  r[i] = pItem->so
66e0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
66f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
6700: 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  o;.}.../*.** If 
6710: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
6720: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
6730: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
6740: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
6750: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
6760: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
6770: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
6780: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
6790: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
67a0: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
67b0: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
67c0: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
67d0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
67e0: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
67f0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
6800: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
6810: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6820: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
6830: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6840: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
6850: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
6860: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
6870: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
6880: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62  atement */.  Vdb
6890: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
68a0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
68b0: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
68c0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
68d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
68e0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
68f0: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
6900: 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69  st *pDest /* Wri
6910: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
6920: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
6930: 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b  .  int addrBreak
6940: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
6950: 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20 20  keLabel(v);     
6960: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
6970: 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  exit loop */.  i
6980: 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20  nt addrContinue 
6990: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
69a0: 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a  eLabel(v);  /* J
69b0: 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78  ump here for nex
69c0: 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
69d0: 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61   addr;.  int iTa
69e0: 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54  b;.  int pseudoT
69f0: 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69  ab = 0;.  ExprLi
6a00: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
6a10: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69  ->pOrderBy;..  i
6a20: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
6a30: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69  ->eDest;.  int i
6a40: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50  Parm = pDest->iP
6a50: 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67 52  arm;..  int regR
6a60: 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ow;.  int regRow
6a70: 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f  id;..  iTab = pO
6a80: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
6a90: 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c  ;.  regRow = sql
6aa0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6ab0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 65 44  Parse);.  if( eD
6ac0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6ad0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
6ae0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70  routine ){.    p
6af0: 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73  seudoTab = pPars
6b00: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
6b10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6b20: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
6b30: 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65  o, pseudoTab, re
6b40: 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  gRow, nColumn);.
6b50: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30      regRowid = 0
6b60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6b70: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
6b80: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
6b90: 73 65 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  se);.  }.  addr 
6ba0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
6bb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
6bc0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
6bd0: 65 61 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  eak);.  codeOffs
6be0: 65 74 28 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e  et(v, p, addrCon
6bf0: 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
6c00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6c10: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
6c20: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
6c30: 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  + 1, regRow);.  
6c40: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
6c50: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
6c60: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
6c70: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
6c80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
6c90: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
6ca0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6cb0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
6cc0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73  emTab );.      s
6cd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6ce0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
6cf0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
6d00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6d10: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6d20: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
6d30: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
6d40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6d50: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6d60: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
6d70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6d80: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
6d90: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
6da0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
6db0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
6dc0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
6dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6de0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
6df0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
6e00: 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 20 26  , 1, regRowid, &
6e10: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
6e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6e30: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
6e40: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
6e50: 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20  gRow, 1);.      
6e60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6e70: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
6e80: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
6e90: 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  id);.      break
6ea0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6eb0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
6ec0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
6ed0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
6ee0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
6ef0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
6f00: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
6f10: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
6f20: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
6f30: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
6f40: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
6f50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
6f60: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
6f70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
6f80: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
6f90: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6fa0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6fb0: 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20  outine ); .     
6fc0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
6fd0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
6fe0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6ff0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
7000: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 66 6f  tine );.      fo
7010: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
7020: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7030: 61 73 73 65 72 74 28 20 72 65 67 52 6f 77 21 3d  assert( regRow!=
7040: 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20 29 3b  pDest->iMem+i );
7050: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7060: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7070: 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54  _Column, pseudoT
7080: 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69 4d  ab, i, pDest->iM
7090: 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 69  em+i);.        i
70a0: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
70b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
70c0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
70d0: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
70e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
70f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  }.      if( eDes
7100: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
7110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7120: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7130: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
7140: 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e  t->iMem, nColumn
7150: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7160: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
7170: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
7180: 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e  , pDest->iMem, n
7190: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
71a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
71b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
71c0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
71d0: 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20  st->iParm);.    
71e0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
71f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
7200: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7210: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
7220: 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  w);.  sqlite3Rel
7230: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
7240: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  se, regRowid);..
7250: 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20    /* The bottom 
7260: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f  of the loop.  */
7270: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
7280: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
7290: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73  drContinue);.  s
72a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
72b0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
72c0: 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  b, addr);.  sqli
72d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
72e0: 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
72f0: 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  );.  if( eDest==
7300: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
7310: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
7320: 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ne ){.    sqlite
7330: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7340: 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54  P_Close, pseudoT
7350: 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ab, 0);.  }.}../
7360: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
7370: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
7380: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
7390: 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79   'declaration ty
73a0: 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  pe' of the.** ex
73b0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
73c0: 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62  The string may b
73d0: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61  e treated as sta
73e0: 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65  tic by the calle
73f0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  r..**.** The dec
7400: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
7410: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
7420: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
7430: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
7440: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
7450: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
7460: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
7470: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
7480: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
7490: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
74a0: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
74b0: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
74c0: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
74d0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
74e0: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
74f0: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
7500: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
7510: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
7520: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
7530: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
7540: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
7550: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
7560: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
7570: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
7580: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
7590: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
75a0: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
75b0: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
75c0: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
75d0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
75e0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
75f0: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
7600: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
7610: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
7620: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
7630: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
7640: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
7650: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
7660: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
7670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
7680: 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79  t char *columnTy
7690: 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pe(.  NameContex
76a0: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
76b0: 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20  *pExpr,.  const 
76c0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44  char **pzOriginD
76d0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
76e0: 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20  **pzOriginTab,. 
76f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
7700: 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63  OriginCol.){.  c
7710: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
7720: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
7730: 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20  st *zOriginDb = 
7740: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
7750: 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b  *zOriginTab = 0;
7760: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
7770: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20  OriginCol = 0;. 
7780: 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 4e 45   int j;.  if( NE
7790: 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c  VER(pExpr==0) ||
77a0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d   pNC->pSrcList==
77b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
77c0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
77d0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
77e0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
77f0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
7800: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
7810: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
7820: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
7830: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
7840: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
7850: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
7860: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
7870: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
7880: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
7890: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
78a0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
78b0: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
78c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
78d0: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
78e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
78f0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
7900: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
7910: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
7920: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
7930: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
7940: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
7950: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
7960: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
7970: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
7980: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
7990: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
79a0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
79b0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
79c0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
79d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
79e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
79f0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69  UMN );.      whi
7a00: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
7a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
7a20: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
7a30: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
7a40: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
7a50: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
7a60: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
7a70: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
7a80: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
7a90: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
7aa0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
7ab0: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
7ac0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
7ad0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
7ae0: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
7af0: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
7b00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7b10: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
7b20: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
7b30: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7b40: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
7b50: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
7b60: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
7b70: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
7b80: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
7b90: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
7ba0: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
7bb0: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
7bc0: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
7bd0: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
7be0: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
7bf0: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
7c00: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
7c10: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
7c20: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
7c30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
7c40: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
7c50: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
7c60: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
7c70: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
7c80: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
7c90: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
7ca0: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
7cb0: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
7cc0: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
7cd0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
7ce0: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
7cf0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
7d00: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
7d10: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
7d20: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
7d30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
7d40: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
7d50: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
7d60: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
7d70: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
7d80: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
7d90: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
7da0: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
7db0: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
7dc0: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
7dd0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
7de0: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
7df0: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
7e00: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
7e10: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
7e20: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
7e30: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
7e40: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
7e50: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
7e60: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
7e70: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
7e80: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
7e90: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
7ea0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
7eb0: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
7ec0: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
7ed0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
7ee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
7ef0: 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62  b && pExpr->pTab
7f00: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ==pTab );.      
7f10: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
7f20: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
7f30: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
7f40: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
7f50: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
7f60: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
7f70: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
7f80: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
7f90: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
7fa0: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
7fb0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
7fc0: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
7fd0: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
7fe0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
7ff0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
8000: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
8010: 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d   ALWAYS(iCol<pS-
8020: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
8030: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
8040: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
8050: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
8060: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
8070: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
8080: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
8090: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
80a0: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
80b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
80c0: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
80d0: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
80e0: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
80f0: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
8100: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
8110: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
8120: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
8130: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
8140: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
8150: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
8160: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
8170: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
8180: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
8190: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
81a0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
81b0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
81c0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
81d0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
81e0: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
81f0: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
8200: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
8210: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8220: 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
8230: 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  S(pTab->pSchema)
8240: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
8250: 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20   real table */. 
8260: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
8270: 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pS );.        if
8280: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
8290: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
82a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
82b0: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
82c0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
82d0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
82e0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
82f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
8300: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
8310: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43          zOriginC
8320: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
8330: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8340: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
8350: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8360: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
8370: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54   zOriginCol = pT
8380: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
8390: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
83a0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 54          zOriginT
83b0: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
83c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
83d0: 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20  C->pParse ){.   
83e0: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
83f0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
8400: 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73  Index(pNC->pPars
8410: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
8420: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
8430: 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e 43   zOriginDb = pNC
8440: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  ->pParse->db->aD
8450: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
8460: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8470: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8480: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
8490: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
84a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
84b0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
84c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
84d0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
84e0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
84f0: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
8500: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
8510: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
8520: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
8530: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
8540: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
8550: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
8560: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
8570: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
8580: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
8590: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
85a0: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
85b0: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
85c0: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
85d0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
85e0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
85f0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
8600: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
8610: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
8620: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
8630: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
8640: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
8650: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
8660: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
8670: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
8680: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
8690: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
86a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
86b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
86c0: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e   .  if( pzOrigin
86d0: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
86e0: 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26  ( pzOriginTab &&
86f0: 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a   pzOriginCol );.
8700: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20      *pzOriginDb 
8710: 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20  = zOriginDb;.   
8720: 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20   *pzOriginTab = 
8730: 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20  zOriginTab;.    
8740: 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a  *pzOriginCol = z
8750: 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20  OriginCol;.  }. 
8760: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
8770: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
8780: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
8790: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
87a0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
87b0: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
87c0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
87d0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
87e0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
87f0: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
8800: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
8810: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
8820: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
8830: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
8840: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
8850: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8860: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
8870: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
8880: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
8890: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
88a0: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
88b0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
88c0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
88d0: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
88e0: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
88f0: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
8900: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
8910: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
8920: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
8930: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
8940: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
8950: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
8970: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
8980: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
8990: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
89a0: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
89b0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
89c0: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
89d0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
89e0: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
89f0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
8a00: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
8a10: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
8a20: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29  gTab, &zOrigCol)
8a30: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
8a40: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
8a50: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
8a60: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
8a70: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
8a80: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
8a90: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
8aa0: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
8ab0: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
8ac0: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
8ad0: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
8ae0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
8af0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8b00: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8b10: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
8b20: 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  gDb, SQLITE_TRAN
8b30: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
8b40: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8b50: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8b60: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
8b70: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
8b80: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
8b90: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8ba0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
8bb0: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51  MN, zOrigCol, SQ
8bc0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
8bd0: 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65  .#else.    zType
8be0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
8bf0: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b  NC, p, 0, 0, 0);
8c00: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
8c10: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8c20: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8c30: 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c  DECLTYPE, zType,
8c40: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
8c50: 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  T);.  }.#endif /
8c60: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  * SQLITE_OMIT_DE
8c70: 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  CLTYPE */.}../*.
8c80: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
8c90: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
8ca0: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
8cb0: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
8cc0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8cd0: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
8ce0: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
8cf0: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
8d00: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
8d10: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
8d20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
8d30: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
8d40: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
8d50: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
8d60: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
8d70: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
8d80: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
8d90: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
8da0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
8db0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
8dc0: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
8dd0: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
8de0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
8df0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
8e00: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
8e10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8e20: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
8e30: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
8e40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8e50: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
8e60: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
8e70: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
8e80: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
8e90: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
8ea0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8eb0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
8ec0: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
8ed0: 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30  et || NEVER(v==0
8ee0: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
8ef0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
8f00: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
8f10: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
8f20: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
8f30: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
8f40: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
8f50: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
8f60: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
8f70: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
8f80: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
8f90: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
8fa0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
8fb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
8fc0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
8fd0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
8fe0: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
8ff0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
9000: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
9010: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
9020: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
9030: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
9040: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
9050: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
9060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9070: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
9080: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
9090: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
90a0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
90b0: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d  else if( (p->op=
90c0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
90d0: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
90e0: 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20  MN) && pTabList 
90f0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
9100: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
9110: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
9120: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
9130: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
9140: 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61  =0; ALWAYS(j<pTa
9150: 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b  bList->nSrc); j+
9160: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9170: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
9180: 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c  Cursor==p->iTabl
9190: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
91a0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
91b0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
91c0: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
91d0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
91e0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
91f0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
9200: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
9210: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
9220: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
9230: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
9240: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
9250: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
9260: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
9270: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
9280: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
9290: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
92a0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
92b0: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
92c0: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
92d0: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mes ){.        s
92e0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
92f0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
9300: 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20  ME_NAME, .      
9310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
9320: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
9330: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
9340: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
9350: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9360: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
9370: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
9380: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
9390: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
93a0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
93b0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
93c0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
93d0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
93e0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
93f0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
9400: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
9410: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9430: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
9440: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
9450: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
9460: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
9470: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9480: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
9490: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
94a0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20  NAME_NAME, .    
94b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
94c0: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
94d0: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
94e0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
94f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
9500: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
9510: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
9520: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69  , pEList);.}..#i
9530: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9540: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9550: 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  T./*.** Name of 
9560: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
9570: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
9580: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
9590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
95a0: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
95b0: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
95c0: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
95d0: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
95e0: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
95f0: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
9600: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9610: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
9620: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
9630: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9640: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
9650: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
9660: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9670: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
9680: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
9690: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
96a0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
96b0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
96c0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
96d0: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  LECT */../*.** G
96e0: 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65 73  iven a an expres
96f0: 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68  sion list (which
9700: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c   is really the l
9710: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
9720: 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20  ns.** that form 
9730: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
9740: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
9750: 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70  ment) compute ap
9760: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c  propriate.** col
9770: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20  umn names for a 
9780: 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64  table that would
9790: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
97a0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
97b0: 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   All column name
97c0: 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65  s will be unique
97d0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
97e0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   column names ar
97f0: 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c  e computed.  Col
9800: 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d  umn.zType, Colum
9810: 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20  n.zColl,.** and 
9820: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
9830: 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65  Column are zeroe
9840: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
9850: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
9860: 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f  cess.  If a memo
9870: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
9880: 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73  ror occurs,.** s
9890: 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61  tore NULL in *pa
98a0: 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e  Col and 0 in *pn
98b0: 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Col and return S
98c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
98d0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
98e0: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
98f0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
9900: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
9910: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
9920: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
9930: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
9940: 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f  /* Expr list fro
9950: 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76  m which to deriv
9960: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
9970: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20  /.  int *pnCol, 
9980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
9990: 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
99a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20  of columns here 
99b0: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61  */.  Column **pa
99c0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Col          /* 
99d0: 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f  Write the new co
99e0: 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a  lumn list here *
99f0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
9a00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9a10: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
9a20: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
9a30: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
9a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9a50: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
9a60: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a80: 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d  Index added to m
9a90: 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69  ake the name uni
9aa0: 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  que */.  Column 
9ab0: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20  *aCol, *pCol;   
9ac0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
9ad0: 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20  ing over result 
9ae0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
9af0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
9b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9b10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
9b20: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9b30: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20  */.  Expr *p;   
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b50: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
9b60: 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  or a single resu
9b70: 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  lt column */.  c
9b80: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
9b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
9ba0: 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  lumn name */.  i
9bb0: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
9bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9bd0: 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e  ze of name in zN
9be0: 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 2a 70 6e 43  ame[] */..  *pnC
9bf0: 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70 45 4c 69  ol = nCol = pELi
9c00: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 43 6f  st->nExpr;.  aCo
9c10: 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d 20 73 71 6c  l = *paCol = sql
9c20: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
9c30: 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
9c40: 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69 66  [0])*nCol);.  if
9c50: 28 20 61 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  ( aCol==0 ) retu
9c60: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
9c70: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
9c80: 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  =aCol; i<nCol; i
9c90: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
9ca0: 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
9cb0: 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
9cc0: 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
9cd0: 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74  /.    p = pEList
9ce0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
9cf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
9d00: 67 68 74 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  ght==0 || ExprHa
9d10: 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 52 69  sProperty(p->pRi
9d20: 67 68 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  ght, EP_IntValue
9d30: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
9d40: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 75   || p->pRight->u
9d50: 2e 7a 54 6f 6b 65 6e 3d 3d 30 20 7c 7c 20 70 2d  .zToken==0 || p-
9d60: 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65  >pRight->u.zToke
9d70: 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69  n[0]!=0 );.    i
9d80: 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
9d90: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
9da0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
9db0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e  f the column con
9dc0: 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61  tains an "AS <na
9dd0: 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65  me>" phrase, use
9de0: 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e   <name> as the n
9df0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
9e00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
9e10: 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  rDup(db, zName);
9e20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9e30: 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72    Expr *pColExpr
9e40: 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78   = p;  /* The ex
9e50: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
9e60: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
9e70: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
9e80: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
9e90: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61        /* Table a
9ea0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
9eb0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
9ec0: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
9ed0: 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
9ee0: 44 4f 54 20 29 20 70 43 6f 6c 45 78 70 72 20 3d  DOT ) pColExpr =
9ef0: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68   pColExpr->pRigh
9f00: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  t;.      if( pCo
9f10: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  lExpr->op==TK_CO
9f20: 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70  LUMN && ALWAYS(p
9f30: 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30  ColExpr->pTab!=0
9f40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
9f50: 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20  For columns use 
9f60: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
9f70: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
9f80: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45  int iCol = pColE
9f90: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
9fa0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f        pTab = pCo
9fb0: 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  lExpr->pTab;.   
9fc0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
9fd0: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
9fe0: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e  PKey;.        zN
9ff0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
a000: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20  intf(db, "%s",. 
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
a030: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
a040: 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20   : "rowid");.   
a050: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f     }else if( pCo
a060: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  lExpr->op==TK_ID
a070: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
a080: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
a090: 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45  erty(pColExpr, E
a0a0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
a0b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
a0c0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
a0d0: 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72  , "%s", pColExpr
a0e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
a0f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a100: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
a110: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
a120: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
a130: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
a140: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  */.        zName
a150: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
a160: 66 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69  f(db, "%s", pELi
a170: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b  st->a[i].zSpan);
a180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a190: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
a1a0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
a1b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a1c0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
a1d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
a1e0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
a1f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
a200: 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
a210: 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
a220: 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
a230: 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74  pend a integer t
a240: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
a250: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
a260: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
a270: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
a280: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
a290: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
a2a0: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
a2b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
a2c0: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
a2d0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
a2e0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
a2f0: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
a300: 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d    zName[nName] =
a310: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77   0;.        zNew
a320: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
a330: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25 64  rintf(db, "%s:%d
a340: 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29  ", zName, ++cnt)
a350: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a360: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
a370: 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  e);.        zNam
a380: 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20  e = zNewName;.  
a390: 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20        j = -1;.  
a3a0: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d        if( zName=
a3b0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
a3c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43    }.    }.    pC
a3d0: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
a3e0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  e;.  }.  if( db-
a3f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a400: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
a410: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
a420: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a430: 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
a440: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
a450: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
a460: 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
a470: 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
a480: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
a490: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
a4a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a4b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
a4c0: 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
a4d0: 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
a4e0: 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
a4f0: 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
a500: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a510: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
a520: 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
a530: 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
a540: 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
a550: 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
a560: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
a570: 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
a580: 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
a590: 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
a5a0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
a5b0: 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
a5c0: 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
a5d0: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
a5e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
a5f0: 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
a600: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
a610: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
a620: 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
a630: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
a640: 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  oid selectAddCol
a650: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
a660: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
a670: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
a680: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
a690: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20   */.  int nCol, 
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a6b0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
a6c0: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
a6d0: 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ol,         /* L
a6e0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ist of columns *
a6f0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
a700: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
a710: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
a720: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
a730: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
a740: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a750: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
a760: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
a770: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
a780: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
a790: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
a7a0: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
a7b0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
a7c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
a7d0: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
a7e0: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
a7f0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
a800: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
a810: 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65 6c  sert( nCol==pSel
a820: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
a830: 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
a840: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
a850: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a860: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
a870: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
a880: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
a890: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
a8a0: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
a8b0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
a8c0: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
a8d0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
a8e0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
a8f0: 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45  .    p = a[i].pE
a900: 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  xpr;.    pCol->z
a910: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Type = sqlite3Db
a920: 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d  StrDup(db, colum
a930: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
a940: 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43  , 0, 0));.    pC
a950: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
a960: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
a970: 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  ty(p);.    if( p
a980: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
a990: 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
a9a0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
a9b0: 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ONE;.    pColl =
a9c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
a9d0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
a9e0: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
a9f0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
aa00: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
aa10: 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
aa20: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
aa30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
aa40: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
aa50: 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ent, generate a 
aa60: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
aa70: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
aa80: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
aa90: 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e   of that SELECT.
aaa0: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
aab0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
aac0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
aad0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
aae0: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
aaf0: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ab;.  sqlite3 *d
ab00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ab10: 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73    int savedFlags
ab20: 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20  ;..  savedFlags 
ab30: 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64  = db->flags;.  d
ab40: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
ab50: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
ab60: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
ab70: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
ab80: 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  Names;.  sqlite3
ab90: 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
aba0: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e, pSelect, 0);.
abb0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
abc0: 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rr ) return 0;. 
abd0: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
abe0: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
abf0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
ac00: 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ior;.  db->flags
ac10: 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20   = savedFlags;. 
ac20: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
ac30: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
ac40: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
ac50: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
ac60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
ac70: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c    }.  /* The sql
ac80: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
ac90: 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20  elect() is only 
aca0: 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20  used n contexts 
acb0: 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a  where lookaside.
acc0: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
acd0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62   */.  assert( db
ace0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
acf0: 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61  bled==0 );.  pTa
ad00: 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  b->nRef = 1;.  p
ad10: 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  Tab->zName = 0;.
ad20: 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20    pTab->nRowEst 
ad30: 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 73 65 6c  = 1000000;.  sel
ad40: 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
ad50: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
ad60: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
ad70: 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
ad80: 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c  ab->aCol);.  sel
ad90: 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
ada0: 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
adb0: 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  rse, pTab->nCol,
adc0: 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65   pTab->aCol, pSe
add0: 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69  lect);.  pTab->i
ade0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28  PKey = -1;.  if(
adf0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ae00: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
ae10: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
ae20: 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72  pTab);.    retur
ae30: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
ae40: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
ae50: 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
ae60: 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
ae70: 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
ae80: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
ae90: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
aea0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
aeb0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
aec0: 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
aed0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
aee0: 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
aef0: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
af00: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
af10: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
af20: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
af30: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
af40: 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  be = sqlite3Vdbe
af50: 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64  Create(pParse->d
af60: 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b);.#ifndef SQLI
af70: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
af80: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20    if( v ){.     
af90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
afa0: 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b  p0(v, OP_Trace);
afb0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
afc0: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
afd0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
afe0: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
aff0: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
b000: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
b010: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
b020: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
b030: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
b040: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
b050: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
b060: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
b070: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
b080: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
b090: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
b0a0: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
b0b0: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
b0c0: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
b0d0: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
b0e0: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
b0f0: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
b100: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
b110: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
b120: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
b130: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
b140: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
b150: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
b160: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
b170: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
b180: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
b190: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
b1a0: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
b1b0: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
b1c0: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
b1d0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
b1e0: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
b1f0: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
b200: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
b210: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
b220: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
b230: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
b240: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
b250: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
b260: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a  default values.*
b270: 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e  * (usually but n
b280: 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72  ot always -1) pr
b290: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
b2a0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
b2b0: 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d  Only if pLimit!=
b2c0: 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20  0 or pOffset!=0 
b2d0: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
b2e0: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
b2f0: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
b300: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
b310: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
b320: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
b330: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
b340: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
b350: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
b360: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
b370: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
b380: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
b390: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
b3a0: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
b3b0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
b3c0: 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
b3d0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
b3e0: 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
b3f0: 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
b400: 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20  t;.  int addr1, 
b410: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  n;.  if( p->iLim
b420: 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  it ) return;..  
b430: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
b440: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
b450: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
b460: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
b470: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
b480: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
b490: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
b4a0: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
b4b0: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
b4c0: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
b4d0: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
b4e0: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
b4f0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
b500: 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
b510: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
b520: 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c   p->pOffset==0 |
b530: 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  | p->pLimit!=0 )
b540: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  ;.  if( p->pLimi
b550: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
b560: 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
b570: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
b580: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
b590: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
b5a0: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
b5b0: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
b5c0: 56 44 42 45 20 73 68 6f 75 6c 64 20 68 61 76 65  VDBE should have
b5d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
b5e0: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69  located */.    i
b5f0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
b600: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69  Integer(p->pLimi
b610: 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20  t, &n) ){.      
b620: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b630: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
b640: 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20   n, iLimit);.   
b650: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
b660: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
b670: 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  r"));.      if( 
b680: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
b690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b6a0: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
b6b0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
b6c0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
b6d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b6e0: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  de(pParse, p->pL
b6f0: 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  imit, iLimit);. 
b700: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b710: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
b720: 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
b730: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
b740: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
b750: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
b760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b770: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
b780: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
b790: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
b7a0: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
b7b0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
b7c0: 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
b7d0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
b7e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
b7f0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
b800: 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
b810: 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
b820: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
b830: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b840: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
b850: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
b860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b870: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
b880: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
b890: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
b8a0: 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
b8b0: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
b8c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b8d0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
b8e0: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
b8f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b900: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
b910: 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a  r, 0, iOffset);.
b920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b930: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
b940: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
b950: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b960: 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20  OP_Add, iLimit, 
b970: 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  iOffset, iOffset
b980: 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +1);.      VdbeC
b990: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
b9a0: 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20  T+OFFSET"));.   
b9b0: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
b9c0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b9d0: 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74  OP_IfPos, iLimit
b9e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b9f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ba00: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f  _Integer, -1, iO
ba10: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
ba20: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ba30: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
ba40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
ba50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ba60: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
ba70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
ba80: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
ba90: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
baa0: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
bab0: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
bac0: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
bad0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
bae0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
baf0: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
bb00: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
bb10: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
bb20: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
bb30: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
bb40: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
bb50: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
bb60: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
bb70: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
bb80: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
bb90: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
bba0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
bbb0: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
bbc0: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
bbd0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
bbe0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
bbf0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
bc00: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
bc10: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
bc20: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
bc30: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
bc40: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
bc50: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
bc60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
bc70: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
bc80: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
bc90: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26  .  if( pRet==0 &
bca0: 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  & iCol<p->pEList
bcb0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ->nExpr ){.    p
bcc0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
bcd0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
bce0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
bcf0: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
bd00: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
bd10: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
bd20: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
bd30: 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f  SELECT */../* Fo
bd40: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
bd50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
bd60: 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
bd70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
bd80: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
bd90: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
bda0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
bdb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
bdc0: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
bdd0: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
bde0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
bdf0: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
be00: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
be10: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
be20: 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  );...#ifndef SQL
be30: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
be40: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54  D_SELECT./*.** T
be50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
be60: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
be70: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
be80: 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74  y form from.** t
be90: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
bea0: 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e  ate queries usin
beb0: 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41  g UNION, UNION A
bec0: 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a  LL, EXCEPT, or.*
bed0: 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a  * INTERSECT.**.*
bee0: 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
bef0: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
bf00: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
bf10: 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
bf20: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
bf30: 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
bf40: 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
bf50: 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
bf60: 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
bf70: 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
bf80: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
bf90: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
bfa0: 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
bfb0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
bfc0: 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
bfd0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
bfe0: 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
bff0: 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
c000: 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
c010: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
c020: 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
c030: 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
c040: 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
c050: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
c060: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
c070: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
c080: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
c090: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
c0a0: 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
c0b0: 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
c0c0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
c0d0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
c0e0: 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
c0f0: 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
c100: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
c110: 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
c120: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
c130: 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
c140: 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
c150: 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
c160: 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
c170: 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
c180: 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
c190: 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
c1a0: 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
c1b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
c1c0: 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
c1d0: 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
c1e0: 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
c1f0: 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
c200: 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
c210: 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
c220: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
c230: 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
c240: 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
c250: 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
c260: 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
c270: 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
c280: 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
c290: 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
c2a0: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
c2b0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
c2c0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
c2d0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
c2e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c2f0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
c300: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c310: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
c320: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
c330: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
c340: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
c350: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
c360: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
c370: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
c380: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
c390: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
c3a0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
c3b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
c3c0: 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
c3d0: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
c3e0: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
c3f0: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c410: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
c420: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
c430: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
c440: 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  ;      /* Altern
c450: 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69  ative data desti
c460: 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  nation */.  Sele
c470: 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b  ct *pDelete = 0;
c480: 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69    /* Chain of si
c490: 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20  mple selects to 
c4a0: 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69  delete */.  sqli
c4b0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
c4c0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
c4d0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  nnection */..  /
c4e0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
c4f0: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
c500: 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
c510: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
c520: 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
c530: 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
c540: 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
c550: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
c560: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
c570: 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61   LIMIT..  */.  a
c580: 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
c590: 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c  Prior );  /* Cal
c5a0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75  ling function gu
c5b0: 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75  arantees this mu
c5c0: 63 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  ch */.  db = pPa
c5d0: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f  rse->db;.  pPrio
c5e0: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
c5f0: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
c600: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72  >pRightmost!=pPr
c610: 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ior );.  assert(
c620: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
c630: 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f  ost==p->pRightmo
c640: 73 74 20 29 3b 0a 20 20 64 65 73 74 20 3d 20 2a  st );.  dest = *
c650: 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
c660: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
c670: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c680: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
c690: 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
c6a0: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
c6b0: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
c6c0: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
c6d0: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
c6e0: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
c6f0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c700: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
c710: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
c720: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c730: 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
c740: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
c750: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
c760: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
c770: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
c780: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
c790: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
c7a0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
c7b0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
c7c0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c7d0: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
c7e0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
c7f0: 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
c800: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
c810: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
c820: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
c830: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
c840: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
c850: 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
c860: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
c870: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
c880: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
c890: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c8a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
c8b0: 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
c8c0: 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  Parm, p->pEList-
c8d0: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >nExpr);.    sql
c8e0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
c8f0: 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
c900: 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74 2e 65  RED);.    dest.e
c910: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
c920: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
c930: 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54   sure all SELECT
c940: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
c950: 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  nt have the same
c960: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
c970: 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69  nts.  ** in thei
c980: 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20  r result sets.. 
c990: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
c9a0: 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f  >pEList && pPrio
c9b0: 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69  r->pEList );.  i
c9c0: 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
c9d0: 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr!=pPrior->pEL
c9e0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
c9f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ca00: 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
ca10: 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
ca20: 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
ca30: 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
ca40: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
ca50: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
ca60: 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
ca70: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
ca80: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
ca90: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
caa0: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
cab0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20  ompound SELECTs 
cac0: 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44  that have an ORD
cad0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
cae0: 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
caf0: 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ely..  */.  if( 
cb00: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
cb10: 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
cb20: 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61  electOrderBy(pPa
cb30: 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
cb40: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
cb50: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
cb60: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
cb70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
cb80: 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
cb90: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
cba0: 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
cbb0: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
cbc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
cbd0: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
cbe0: 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
cbf0: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
cc00: 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
cc10: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
cc20: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 72 63  Offset;.      rc
cc30: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
cc40: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
cc50: 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
cc60: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
cc70: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
cc80: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
cc90: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
cca0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
ccb0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
ccc0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
ccd0: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
cce0: 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
ccf0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
cd00: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
cd10: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
cd20: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
cd30: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
cd40: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
cd50: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
cd60: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20  Limit);.        
cd70: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
cd80: 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c  "Jump ahead if L
cd90: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
cda0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
cdb0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
cdc0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
cdd0: 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
cde0: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
cdf0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
ce00: 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
ce10: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
ce20: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
ce30: 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
ce40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ce50: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
ce60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ce70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ce80: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
ce90: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
cea0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
ceb0: 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
cec0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
ced0: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
cee0: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
cef0: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38  sult */.      u8
cf00: 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f   op = 0;       /
cf10: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
cf20: 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
cf30: 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
cf40: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
cf50: 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
cf60: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
cf70: 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
cf80: 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
cf90: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
cfa0: 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65  pOffset; /* Save
cfb0: 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
cfc0: 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66  Limit and p->nOf
cfd0: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  fset */.      in
cfe0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
cff0: 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65  lectDest unionde
d000: 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63  st;..      testc
d010: 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45  ase( p->op==TK_E
d020: 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74  XCEPT );.      t
d030: 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
d040: 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
d050: 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f    priorOp = SRT_
d060: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
d070: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
d080: 6f 72 4f 70 20 26 26 20 41 4c 57 41 59 53 28 21  orOp && ALWAYS(!
d090: 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d 3e  p->pLimit &&!p->
d0a0: 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20  pOffset) ){.    
d0b0: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
d0c0: 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
d0d0: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
d0e0: 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
d0f0: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
d100: 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
d110: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d120: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70  p->pRightmost!=p
d130: 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79   );  /* Can only
d140: 20 68 61 70 70 65 6e 20 66 6f 72 20 6c 65 66 74   happen for left
d150: 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20  ward elements.  
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d180: 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61 79     ** of a 3-way
d190: 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75 6e   or more compoun
d1a0: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  d */.        ass
d1b0: 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d  ert( p->pLimit==
d1c0: 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74  0 );      /* Not
d1d0: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
d1e0: 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
d1f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d200: 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29   p->pOffset==0 )
d210: 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c  ;     /* Not all
d220: 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64  owed on leftward
d230: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   elements */.   
d240: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
d250: 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20  dest.iParm;.    
d260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d270: 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64   /* We will need
d280: 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
d290: 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wn temporary tab
d2a0: 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20  le to hold the. 
d2b0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
d2c0: 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
d2d0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
d2e0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
d2f0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
d300: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d310: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
d320: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
d330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d340: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
d350: 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  eral, unionTab, 
d360: 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
d370: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
d380: 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
d390: 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
d3a0: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
d3b0: 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52  r;.        p->pR
d3c0: 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61  ightmost->selFla
d3d0: 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
d3e0: 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
d3f0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
d400: 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
d410: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
d420: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d430: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
d440: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
d450: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
d460: 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
d470: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
d480: 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
d490: 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
d4a0: 54 61 62 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Tab);.      rc =
d4b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
d4c0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
d4d0: 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
d4e0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
d4f0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d500: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
d510: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
d520: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
d530: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
d540: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
d550: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
d560: 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  PT ){.        op
d570: 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20   = SRT_Except;. 
d580: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d590: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
d5a0: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
d5b0: 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f         op = SRT_
d5c0: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  Union;.      }. 
d5d0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
d5e0: 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
d5f0: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
d600: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
d610: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
d620: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
d630: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
d640: 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e  = 0;.      union
d650: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
d660: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d670: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
d680: 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  , p, &uniondest)
d690: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
d6a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d6b0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72  );.      /* Quer
d6c0: 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  y flattening in 
d6d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
d6e0: 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e  might refill p->
d6f0: 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20  pOrderBy..      
d700: 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65  ** Be sure to de
d710: 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79  lete p->pOrderBy
d720: 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20  , therefore, to 
d730: 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c  avoid a memory l
d740: 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  eak. */.      sq
d750: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
d760: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
d770: 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  rBy);.      pDel
d780: 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
d790: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
d7a0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
d7b0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
d7c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
d7d0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
d7e0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
d7f0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
d800: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
d810: 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
d820: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
d830: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
d840: 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ffset = 0;..    
d850: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
d860: 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
d870: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
d880: 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
d890: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
d8a0: 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
d8b0: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
d8c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
d8d0: 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 50 61  ionTab==dest.iPa
d8e0: 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74  rm || dest.eDest
d8f0: 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20  !=priorOp );.   
d900: 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
d910: 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
d920: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
d930: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
d940: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d950: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
d960: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
d970: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
d980: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
d990: 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
d9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
d9b0: 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
d9c0: 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
d9d0: 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
d9e0: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
d9f0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
da00: 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
da10: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
da20: 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
da30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
da40: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
da50: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
da60: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
da70: 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
da80: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
da90: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
daa0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
dab0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
dac0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
dad0: 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
dae0: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
daf0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
db00: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
db10: 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
db20: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
db30: 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
db40: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
db50: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
db70: 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f  , -1, &dest, iCo
db80: 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
db90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dba0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
dbb0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
dbc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dbd0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
dbe0: 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
dbf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dc00: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
dc10: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
dc20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc30: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
dc40: 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
dc50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dc60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
dc70: 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
dc80: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
dc90: 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
dca0: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
dcb0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
dcc0: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
dcd0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
dce0: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
dcf0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
dd00: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
dd10: 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
dd20: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
dd30: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
dd40: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
dd50: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
dd60: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
dd70: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
dd80: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
dd90: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
dda0: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
ddb0: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
ddc0: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
ddd0: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
dde0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
ddf0: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
de00: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
de10: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
de20: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
de30: 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
de40: 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
de50: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
de60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
de70: 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
de80: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
de90: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
dea0: 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
deb0: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
dec0: 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
ded0: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
dee0: 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ost->selFlags |=
def0: 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
df00: 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
df10: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
df20: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
df30: 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
df40: 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
df50: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
df60: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
df70: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
df80: 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
df90: 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
dfa0: 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 72  , tab1);.      r
dfb0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
dfc0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
dfd0: 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
dfe0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
dff0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
e000: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e010: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
e020: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
e030: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
e040: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e050: 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
e060: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
e070: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e080: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
e090: 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
e0a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e0b0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
e0c0: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
e0d0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
e0e0: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
e0f0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
e100: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
e110: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
e120: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
e130: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
e140: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
e150: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
e160: 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
e170: 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32  est.iParm = tab2
e180: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e190: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
e1a0: 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74  e, p, &intersect
e1b0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
e1c0: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
e1d0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
e1e0: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
e1f0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
e200: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
e210: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
e220: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
e230: 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
e240: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
e250: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
e260: 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20  = pOffset;..    
e270: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
e280: 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
e290: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
e2a0: 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
e2b0: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
e2c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e2d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
e2e0: 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
e2f0: 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
e300: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
e310: 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
e320: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68   = p;.        wh
e330: 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
e340: 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
e350: 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
e360: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
e370: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
e380: 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
e390: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
e3a0: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
e3b0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
e3c0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
e3d0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
e3e0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
e3f0: 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
e400: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
e410: 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
e420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e430: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
e440: 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
e450: 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
e460: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
e470: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
e480: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
e490: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e4a0: 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31  RowKey, tab1, r1
e4b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e4c0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
e4d0: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
e4e0: 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
e4f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e500: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
e510: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
e520: 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
e530: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
e540: 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d  pEList, tab1, p-
e550: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65        0, -1, &de
e580: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
e590: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
e5a0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
e5b0: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
e5c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e5d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
e5e0: 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
e5f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e600: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
e610: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
e620: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e630: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
e640: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
e650: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e660: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
e670: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
e680: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
e690: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
e6a0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
e6b0: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
e6c0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
e6d0: 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
e6e0: 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
e6f0: 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
e700: 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
e710: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
e720: 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
e730: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
e740: 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
e750: 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
e760: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
e770: 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
e780: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e790: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
e7a0: 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
e7b0: 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
e7c0: 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
e7d0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
e7e0: 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
e7f0: 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
e800: 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
e810: 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
e820: 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
e830: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
e840: 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
e850: 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
e860: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e880: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
e890: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
e8a0: 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
e8b0: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
e8c0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
e8d0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
e8e0: 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
e910: 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
e920: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
e930: 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
e940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
e950: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
e960: 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
e970: 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
e980: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
e990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e9a0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
e9b0: 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
e9c0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
e9d0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
e9e0: 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
e9f0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
ea00: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
ea10: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
ea20: 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  ro(db,.         
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
ea40: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
ea50: 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  nCol*(sizeof(Col
ea60: 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20  lSeq*) + 1));.  
ea70: 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
ea80: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
ea90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
eaa0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
eab0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
eac0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
ead0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
eae0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
eaf0: 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a  d = (u16)nCol;..
eb00: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
eb10: 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
eb20: 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
eb30: 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
eb40: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
eb50: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
eb60: 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
eb70: 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
eb80: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
eb90: 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
eba0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
ebb0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
ebc0: 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
ebd0: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
ebe0: 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
ebf0: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
ec00: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
ec10: 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
ec20: 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
ec30: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
ec40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ec50: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
ec60: 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
ec70: 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
ec80: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
ec90: 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
eca0: 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
ecb0: 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
ecc0: 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
ecd0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
ece0: 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
ecf0: 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
ed00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ed10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ed20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ed30: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
ed40: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
ed50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
ed60: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
ed70: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
ed80: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
ed90: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
eda0: 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
edb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
edc0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
edd0: 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a   pKeyInfo);.  }.
ede0: 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
edf0: 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d  d:.  pDest->iMem
ee00: 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20   = dest.iMem;.  
ee10: 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65  pDest->nMem = de
ee20: 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  st.nMem;.  sqlit
ee30: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
ee40: 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
ee50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
ee60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ee70: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
ee80: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  T */../*.** Code
ee90: 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f   an output subro
eea0: 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f  utine for a coro
eeb0: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
eec0: 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c  tion of a.** SEL
eed0: 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a  ECT statment..**
eee0: 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20  .** The data to 
eef0: 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e  be output is con
ef00: 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69  tained in pIn->i
ef10: 4d 65 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a  Mem.  There are.
ef20: 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c  ** pIn->nMem col
ef30: 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
ef40: 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
ef50: 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
ef60: 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
ef70: 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
ef80: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
ef90: 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
efa0: 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
efb0: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
efc0: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
efd0: 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
efe0: 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
eff0: 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
f000: 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
f010: 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
f020: 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
f030: 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
f040: 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
f050: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
f060: 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
f070: 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
f080: 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
f090: 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
f0a0: 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
f0b0: 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
f0c0: 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
f0d0: 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
f0e0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
f0f0: 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
f100: 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
f110: 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
f120: 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
f130: 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
f140: 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
f150: 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
f160: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f170: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
f180: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
f190: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
f1a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
f1b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
f1c0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
f1d0: 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
f1e0: 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
f1f0: 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
f200: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
f210: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
f220: 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
f230: 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
f240: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
f250: 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
f260: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
f270: 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
f280: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
f290: 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
f2a0: 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
f2b0: 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
f2c0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
f2d0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
f2e0: 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
f2f0: 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
f300: 6e 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20  nt p4type,      
f310: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34         /* The p4
f320: 20 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e   type for pKeyIn
f330: 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  fo */.  int iBre
f340: 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
f350: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
f360: 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
f370: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
f380: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
f390: 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
f3a0: 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
f3b0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
f3c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
f3d0: 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
f3e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
f3f0: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
f400: 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
f410: 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
f420: 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
f430: 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
f440: 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
f450: 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20   int j1, j2;.   
f460: 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
f470: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
f480: 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  Not, regPrev);. 
f490: 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
f4a0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
f4b0: 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d  Compare, pIn->iM
f4c0: 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  em, regPrev+1, p
f4d0: 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20  In->nMem,.      
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
f500: 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29  KeyInfo, p4type)
f510: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f520: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
f530: 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
f540: 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20  nue, j2+2);.    
f550: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f560: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
f570: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
f580: 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  opy(pParse, pIn-
f590: 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31  >iMem, regPrev+1
f5a0: 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  , pIn->nMem);.  
f5b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f5c0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
f5d0: 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
f5e0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
f5f0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
f600: 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
f610: 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
f620: 65 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  e the first OFFS
f630: 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
f640: 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
f650: 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
f660: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
f670: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73  iContinue);..  s
f680: 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44  witch( pDest->eD
f690: 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74  est ){.    /* St
f6a0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
f6b0: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
f6c0: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
f6d0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
f6e0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
f6f0: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
f700: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
f710: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
f720: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
f730: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
f740: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
f750: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f760: 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  e( pDest->eDest=
f770: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
f780: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
f790: 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
f7a0: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
f7b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f7c0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
f7d0: 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  cord, pIn->iMem,
f7e0: 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b   pIn->nMem, r1);
f7f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f800: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
f810: 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
f820: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
f830: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f840: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
f850: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
f860: 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
f870: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
f880: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
f890: 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
f8a0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f8b0: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
f8c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
f8d0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
f8e0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
f8f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
f900: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f910: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
f920: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
f930: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
f940: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
f950: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
f960: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
f970: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
f980: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
f990: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
f9a0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
f9b0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
f9c0: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
f9d0: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
f9e0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
f9f0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
fa00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
fa10: 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20  ->nMem==1 );.   
fa20: 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d     p->affinity =
fa30: 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74   .         sqlit
fa40: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
fa50: 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  y(p->pEList->a[0
fa60: 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
fa70: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
fa80: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
fa90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
faa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fab0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
fac0: 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
fad0: 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d  iMem, 1, r1, &p-
fae0: 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
faf0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fb00: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
fb10: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
fb20: 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20  >iMem, 1);.     
fb30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fb40: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
fb50: 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  rt, pDest->iParm
fb60: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
fb70: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
fb80: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
fb90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fba0: 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65   }..#if 0  /* Ne
fbb0: 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e  ver occurs on an
fbc0: 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20   ORDER BY query 
fbd0: 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  */.    /* If any
fbe0: 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
fbf0: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
fc00: 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
fc10: 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
fc20: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
fc30: 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
fc40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fc50: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
fc60: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b  , pDest->iParm);
fc70: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
fc80: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
fc90: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
fca0: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
fcb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fcc0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
fcd0: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
fce0: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
fcf0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
fd00: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
fd10: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
fd20: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
fd30: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
fd40: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
fd50: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
fd60: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
fd70: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
fd80: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
fd90: 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d  sert( pIn->nMem=
fda0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
fdb0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
fdc0: 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
fdd0: 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  m, pDest->iParm,
fde0: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
fdf0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
fe00: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
fe10: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
fe20: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
fe30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
fe40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fe50: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
fe60: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  .    /* The resu
fe70: 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
fe80: 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
fe90: 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a  registers.    **
fea0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65   starting at pDe
feb0: 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 6e 20  st->iMem.  Then 
fec0: 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
fed0: 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
fee0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
fef0: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
ff00: 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30  ( pDest->iMem==0
ff10: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
ff20: 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65  t->iMem = sqlite
ff30: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
ff40: 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  arse, pIn->nMem)
ff50: 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
ff60: 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d 65  >nMem = pIn->nMe
ff70: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
ff80: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ff90: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
ffa0: 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69  ->iMem, pDest->i
ffb0: 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  Mem, pDest->nMem
ffc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ffd0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
ffe0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
fff0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
10000 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
10010 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
10020 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
10030 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74   result destinat
10040 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ion must be.    
10050 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20  ** SRT_Output.  
10060 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10070 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  never called wit
10080 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20  h any other.    
10090 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  ** destination o
100a0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
100b0 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65  es handled above
100c0 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a   or SRT_Output..
100d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
100e0 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65  r SRT_Output, re
100f0 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
10100 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
10110 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20  f registers.  . 
10120 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f     ** Then the O
10130 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
10140 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61  de is used to ca
10150 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  use sqlite3_step
10160 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74  () to.    ** ret
10170 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77  urn the next row
10180 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20   of result..    
10190 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
101a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
101b0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
101c0 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
101d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
101e0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
101f0 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  Row, pIn->iMem, 
10200 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
10210 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
10220 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
10230 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d  (pParse, pIn->iM
10240 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  em, pIn->nMem);.
10250 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10260 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
10270 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
10280 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
10290 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
102a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
102b0 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
102c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
102d0 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
102e0 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
102f0 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   -1);.  }..  /* 
10300 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62  Generate the sub
10310 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20  routine return. 
10320 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
10330 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
10340 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73   iContinue);.  s
10350 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10360 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
10370 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65  egReturn);..  re
10380 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
10390 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20  .** Alternative 
103a0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
103b0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66  code generator f
103c0 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68  or cases when th
103d0 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44  ere.** is an ORD
103e0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  ER BY clause..**
103f0 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20  .** We assume a 
10400 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c  query of the fol
10410 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
10420 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41  **      <selectA
10430 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c  >  <operator>  <
10440 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20  selectB>  ORDER 
10450 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e  BY <orderbylist>
10460 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  .**.** <operator
10470 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f  > is one of UNIO
10480 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58  N ALL, UNION, EX
10490 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
104a0 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a  CT.  The idea.**
104b0 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68   is to code both
104c0 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c   <selectA> and <
104d0 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68  selectB> with th
104e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
104f0 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69  e as.** co-routi
10500 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74  nes.  Then run t
10510 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69  he co-routines i
10520 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d  n parallel and m
10530 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73  erge the results
10540 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  .** into the out
10550 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  put.  In additio
10560 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72  n to the two cor
10570 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20  outines (called 
10580 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73  selectA and.** s
10590 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72  electB) there ar
105a0 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a  e 7 subroutines:
105b0 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  .**.**    outA: 
105c0 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
105d0 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
105e0 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  A coroutine into
105f0 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
10600 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
10610 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
10620 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  ..**.**    outB:
10630 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
10640 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
10650 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tB coroutine int
10660 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
10670 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
10680 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
10690 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61  y.  (Only genera
106a0 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e  ted for UNION an
106b0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
106c0 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43   UNION ALL.  EXC
106d0 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45  EPT and INSERTSE
106e0 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20  CT never output 
106f0 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20  a row that.**   
10700 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72            appear
10710 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a  s only in B.).**
10720 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20  .**    AltB:    
10730 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
10740 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
10750 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
10760 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A<B..**.**   
10770 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64   AeqB:    Called
10780 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
10790 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
107a0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d  routines and A==
107b0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42  B..**.**    AgtB
107c0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
107d0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
107e0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
107f0 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a  nes and A>B..**.
10800 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43  **    EofA:    C
10810 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
10820 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
10830 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a  m selectA..**.**
10840 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c      EofB:    Cal
10850 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
10860 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
10870 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54  selectB..**.** T
10880 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
10890 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20  n of the latter 
108a0 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73  five subroutines
108b0 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68   depend on which
108c0 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20   .** <operator> 
108d0 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a  is used:.**.**.*
108e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
108f0 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20  ION ALL         
10900 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20  UNION           
10910 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20   EXCEPT         
10920 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20   INTERSECT.**   
10930 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
10940 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
10950 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
10960 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
10970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
10980 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AltB:   outA, ne
10990 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
109a0 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
109b0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
109c0 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71  extA.**.**   Aeq
109d0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
109e0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
109f0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41             nextA
10a00 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e           outA, n
10a10 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74  extA.**.**   Agt
10a20 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  B:   outB, nextB
10a30 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
10a40 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42  B          nextB
10a50 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
10a60 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20  B.**.**   EofA: 
10a70 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
10a80 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
10a90 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20          halt    
10aa0 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
10ab0 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75  .**   EofB:   ou
10ac0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
10ad0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
10ae0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
10af0 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
10b00 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71  In the AltB, Aeq
10b10 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72  B, and AgtB subr
10b20 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20  outines, an EOF 
10b30 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on A following n
10b40 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61  extA.** causes a
10b50 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
10b60 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20   to EofA and an 
10b70 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69  EOF on B followi
10b80 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a  ng nextB causes.
10b90 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  ** an immediate 
10ba0 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57  jump to EofB.  W
10bb0 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45  ithin EofA and E
10bc0 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20  ofB, and EOF on 
10bd0 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c  entry or.** foll
10be0 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73  owing nextX caus
10bf0 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65  es a jump to the
10c00 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65   end of the sele
10c10 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  ct processing..*
10c20 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72  *.** Duplicate r
10c30 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e  emoval in the UN
10c40 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
10c50 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73   INTERSECT cases
10c60 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77   is handled.** w
10c70 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ithin the output
10c80 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
10c90 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74  e regPrev regist
10ca0 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65  er set holds the
10cb0 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f   previously.** o
10cc0 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20  utput value.  A 
10cd0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
10ce0 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  de against this 
10cf0 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75  value and the ou
10d00 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70  tput.** is skipp
10d10 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72  ed if the next r
10d20 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20  esults would be 
10d30 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
10d40 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20  previous..**.** 
10d50 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
10d60 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d  on plan is to im
10d70 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20  plement the two 
10d80 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73  coroutines and s
10d90 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69  even.** subrouti
10da0 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20  nes first, then 
10db0 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20  put the control 
10dc0 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74  logic at the bot
10dd0 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  tom.  Like this:
10de0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
10df0 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20  goto Init.**    
10e00 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coA: coroutine 
10e10 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28  for left query (
10e20 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63  A).**     coB: c
10e30 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
10e40 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20  ht query (B).** 
10e50 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20     outA: output 
10e60 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20  one row of A.** 
10e70 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20     outB: output 
10e80 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e  one row of B (UN
10e90 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c  ION and UNION AL
10ea0 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f  L only).**    Eo
10eb0 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f  fA: ....**    Eo
10ec0 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c  fB: ....**    Al
10ed0 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65  tB: ....**    Ae
10ee0 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67  qB: ....**    Ag
10ef0 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e  tB: ....**    In
10f00 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  it: initialize c
10f10 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65  oroutine registe
10f20 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  rs.**          y
10f30 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20  ield coA.**     
10f40 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67       if eof(A) g
10f50 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20  oto EofA.**     
10f60 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a       yield coB.*
10f70 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
10f80 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a  f(B) goto EofB.*
10f90 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61  *    Cmpr: Compa
10fa0 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20  re A, B.**      
10fb0 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41      Jump AltB, A
10fc0 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20  eqB, AgtB.**    
10fd0 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   End: ....**.** 
10fe0 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65  We call AltB, Ae
10ff0 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20  qB, AgtB, EofA, 
11000 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75  and EofB "subrou
11010 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20  tines" but they 
11020 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61  are not.** actua
11030 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67  lly called using
11040 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20   Gosub and they 
11050 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20  do not Return.  
11060 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f  EofA and EofB lo
11070 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20  op.** until all 
11080 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
11090 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74  d then jump to t
110a0 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20  he "end" labe.  
110b0 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61  AltB, AeqB,.** a
110c0 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20  nd AgtB jump to 
110d0 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20  either L2 or to 
110e0 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45  one of EofA or E
110f0 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ofB..*/.#ifndef 
11100 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
11110 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74  OUND_SELECT.stat
11120 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
11130 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
11140 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11150 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
11160 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
11170 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
11180 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
11190 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
111a0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
111b0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
111c0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
111d0 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
111e0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
111f0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
11200 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11210 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ters */.  Select
11220 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
11230 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
11240 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
11250 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
11260 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
11270 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
11280 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
11290 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
112a0 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a  st destA;     /*
112b0 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
112c0 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a   coroutine A */.
112d0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
112e0 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tB;     /* Desti
112f0 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
11300 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20  tine B */.  int 
11310 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20  regAddrA;       
11320 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
11330 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
11340 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
11350 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20    int regEofA;  
11360 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
11370 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e  to indicate when
11380 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d   select-A is com
11390 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72  plete */.  int r
113a0 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
113b0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
113c0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
113d0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
113e0 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20   int regEofB;   
113f0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74         /* Flag t
11400 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20  o indicate when 
11410 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70  select-B is comp
11420 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  lete */.  int ad
11430 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
11440 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
11450 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
11460 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
11470 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
11480 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
11490 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
114a0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
114b0 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
114c0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
114d0 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
114e0 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
114f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
11500 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
11510 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
11520 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
11530 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
11540 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
11550 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
11560 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
11570 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
11580 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
11590 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
115a0 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
115b0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
115c0 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
115d0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
115e0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
115f0 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
11600 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
11610 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
11620 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
11630 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
11640 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
11650 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
11660 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
11670 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
11680 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
11690 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
116a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
116b0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
116c0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
116d0 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
116e0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
116f0 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
11700 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
11710 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
11720 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
11730 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
11740 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
11750 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
11760 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
11770 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
11780 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
11790 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
117a0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
117b0 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
117c0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
117d0 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
117e0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
117f0 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
11800 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
11810 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
11820 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
11830 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
11840 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
11850 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
11860 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
11870 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
11880 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
11890 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
118a0 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
118b0 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
118c0 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
118d0 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
118e0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
118f0 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
11900 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
11910 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
11920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
11930 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
11940 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
11950 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
11960 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
11970 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
11980 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
11990 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
119a0 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
119b0 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
119c0 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
119d0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
119e0 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
119f0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
11a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
11a10 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11a20 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11a30 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
11a40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11a50 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
11a60 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
11a70 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
11a80 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
11a90 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
11aa0 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
11ab0 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
11ac0 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
11ad0 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
11ae0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73  columns */..  as
11af0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
11b00 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y!=0 );.  assert
11b10 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20  ( pKeyDup==0 ); 
11b20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64  /* "Managed" cod
11b30 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54  e needs this.  T
11b40 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a  icket #3382. */.
11b50 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
11b60 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  b;.  v = pParse-
11b70 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
11b80 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
11b90 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77  /* Already throw
11ba0 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56  n the error if V
11bb0 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64  DBE alloc failed
11bc0 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d   */.  labelEnd =
11bd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11be0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65  Label(v);.  labe
11bf0 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56  lCmpr = sqlite3V
11c00 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11c10 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70  ...  /* Patch up
11c20 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11c30 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ause.  */.  op =
11c40 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69   p->op;  .  pPri
11c50 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
11c60 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
11c70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
11c80 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
11c90 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
11ca0 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b  ert( pOrderBy );
11cb0 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
11cc0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a  rderBy->nExpr;..
11cd0 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f    /* For operato
11ce0 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  rs other than UN
11cf0 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20  ION ALL we have 
11d00 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
11d10 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52  t.  ** the ORDER
11d20 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72   BY clause cover
11d30 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  s every term of 
11d40 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
11d50 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20   Add.  ** terms 
11d60 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
11d70 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73  clause as necess
11d80 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
11d90 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
11da0 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d    for(i=1; db->m
11db0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
11dc0 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  & i<=p->pEList->
11dd0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11de0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
11df0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
11e00 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
11e10 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
11e20 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  ; j<nOrderBy; j+
11e30 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
11e40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
11e50 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20 20  em->iCol>0 );.  
11e60 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
11e70 3e 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  >iCol==i ) break
11e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11e90 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
11ea0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
11eb0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
11ec0 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
11ed0 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
11ee0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
11ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11f00 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
11f10 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
11f20 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
11f30 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
11f40 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
11f50 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
11f60 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
11f70 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
11f80 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  ew);.        pOr
11f90 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42  derBy->a[nOrderB
11fa0 79 2b 2b 5d 2e 69 43 6f 6c 20 3d 20 28 75 31 36  y++].iCol = (u16
11fb0 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
11fc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
11fd0 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ute the comparis
11fe0 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61  on permutation a
11ff0 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20  nd keyinfo that 
12000 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a  is used with.  *
12010 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * the permutatio
12020 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  n used to determ
12030 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
12040 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
12050 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
12060 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
12070 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
12080 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
12090 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
120a0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
120b0 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
120c0 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
120d0 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
120e0 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
120f0 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
12100 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
12110 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
12120 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
12130 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
12140 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
12150 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29  f(int)*nOrderBy)
12160 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
12170 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
12180 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
12190 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  tem;.    for(i=0
121a0 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
121b0 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  ->a; i<nOrderBy;
121c0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
121d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
121e0 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26 26 20  tem->iCol>0  && 
121f0 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e  pItem->iCol<=p->
12200 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
12210 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
12220 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43 6f 6c  i] = pItem->iCol
12230 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
12240 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20 20  pKeyMerge =.    
12250 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f    sqlite3DbMallo
12260 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
12270 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64  *pKeyMerge)+nOrd
12280 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  erBy*(sizeof(Col
12290 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20  lSeq*)+1));.    
122a0 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b  if( pKeyMerge ){
122b0 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
122c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
122d0 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e  u8*)&pKeyMerge->
122e0 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b  aColl[nOrderBy];
122f0 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
12300 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
12310 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  nOrderBy;.      
12320 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d  pKeyMerge->enc =
12330 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20   ENC(db);.      
12340 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
12350 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
12360 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
12370 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  l;.        Expr 
12380 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42  *pTerm = pOrderB
12390 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
123a0 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
123b0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
123c0 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
123d0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65       pColl = pTe
123e0 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  rm->pColl;.     
123f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12400 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
12410 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
12420 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75  Parse, p, aPermu
12430 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  te[i]);.        
12440 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
12450 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
12460 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d  .          pTerm
12470 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
12480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12490 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43     pKeyMerge->aC
124a0 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
124b0 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67          pKeyMerg
124c0 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  e->aSortOrder[i]
124d0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
124e0 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
124f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
12500 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
12510 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
12520 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
12530 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
12540 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
12550 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
12560 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
12570 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
12580 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
12590 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
125a0 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
125b0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
125c0 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
125d0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
125e0 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
125f0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
12600 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
12610 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
12620 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
12630 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
12640 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
12650 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
12660 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
12670 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
12680 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
12690 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
126a0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
126b0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
126c0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
126d0 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
126e0 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
126f0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
12700 65 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33  egPrev = sqlite3
12710 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
12720 72 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20  rse, nExpr+1);. 
12730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12740 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
12750 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b  er, 0, regPrev);
12760 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73  .    pKeyDup = s
12770 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
12780 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  ro(db,.         
12790 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
127a0 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78 70  *pKeyDup) + nExp
127b0 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  r*(sizeof(CollSe
127c0 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69 66  q*)+1) );.    if
127d0 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20  ( pKeyDup ){.   
127e0 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
127f0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
12800 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45  KeyDup->aColl[nE
12810 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79  xpr];.      pKey
12820 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  Dup->nField = (u
12830 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  16)nExpr;.      
12840 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45  pKeyDup->enc = E
12850 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f  NC(db);.      fo
12860 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
12870 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
12880 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  eyDup->aColl[i] 
12890 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
128a0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
128b0 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
128c0 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Dup->aSortOrder[
128d0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
128e0 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a      }.  }. .  /*
128f0 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65   Separate the le
12900 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74  ft and the right
12910 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20   query from one 
12920 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70  another.  */.  p
12930 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
12940 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
12950 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
12960 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
12970 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
12980 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
12990 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
129a0 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
129b0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
129c0 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
129d0 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
129e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
129f0 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
12a00 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
12a10 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
12a20 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
12a30 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
12a40 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
12a50 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
12a60 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
12a70 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
12a80 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
12a90 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
12aa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12ab0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
12ac0 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
12ad0 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
12ae0 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
12b10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12b20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
12b30 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
12b40 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
12b50 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
12b60 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
12b70 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
12b80 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
12b90 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
12ba0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
12bb0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
12bc0 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
12bd0 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
12be0 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d  0;..  regAddrA =
12bf0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
12c00 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70  .  regEofA = ++p
12c10 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
12c20 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
12c30 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45  se->nMem;.  regE
12c40 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ofB = ++pParse->
12c50 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20  nMem;.  regOutA 
12c60 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12c70 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b  ;.  regOutB = ++
12c80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12c90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
12ca0 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52  tInit(&destA, SR
12cb0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
12cc0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
12cd0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
12ce0 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f  &destB, SRT_Coro
12cf0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29  utine, regAddrB)
12d00 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73  ;..  /* Jump pas
12d10 74 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 75  t the various su
12d20 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 63 6f  broutines and co
12d30 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68 65 20  routines to the 
12d40 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20  main.  ** merge 
12d50 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d  loop.  */.  j1 =
12d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12d70 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
12d80 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20    addrSelectA = 
12d90 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
12da0 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f  ntAddr(v);...  /
12db0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
12dc0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
12dd0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
12de0 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
12df0 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
12e00 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
12e10 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
12e20 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
12e30 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12e40 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20  Begin coroutine 
12e50 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22  for left SELECT"
12e60 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c  ));.  pPrior->iL
12e70 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41  imit = regLimitA
12e80 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
12e90 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
12ea0 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c  , &destA);.  sql
12eb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12ec0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
12ed0 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c   regEofA);.  sql
12ee0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12ef0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
12f00 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  ddrA);.  VdbeNoo
12f10 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
12f20 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  d coroutine for 
12f30 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
12f40 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
12f50 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
12f60 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
12f70 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
12f80 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
12f90 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
12fa0 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
12fb0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
12fc0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
12fd0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12fe0 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72  t((v, "Begin cor
12ff0 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
13000 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61   SELECT"));.  sa
13010 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  vedLimit = p->iL
13020 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66  imit;.  savedOff
13030 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
13040 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
13050 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e  regLimitB;.  p->
13060 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20  iOffset = 0;  . 
13070 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13080 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42  Parse, p, &destB
13090 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  );.  p->iLimit =
130a0 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70   savedLimit;.  p
130b0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65  ->iOffset = save
130c0 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74  dOffset;.  sqlit
130d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
130e0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
130f0 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  egEofB);.  sqlit
13100 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13110 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
13120 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  rB);.  VdbeNoopC
13130 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
13140 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
13150 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a  ght SELECT"));..
13160 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
13170 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
13180 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
13190 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41  ent row of the A
131a0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
131b0 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
131c0 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
131d0 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
131e0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
131f0 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
13200 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
13210 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65  .  addrOutA = ge
13220 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
13230 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13250 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74  p, &destA, pDest
13260 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20  , regOutA,.     
13270 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
13280 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34  rev, pKeyDup, P4
13290 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
132a0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
132b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
132c0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
132d0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
132e0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
132f0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
13300 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
13310 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
13320 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
13330 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
13340 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
13350 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
13360 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
13370 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
13380 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
13390 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
133a0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
133b0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
133c0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
133d0 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
133e0 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
133f0 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
13400 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  yDup, P4_KEYINFO
13410 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e  _STATIC, labelEn
13420 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  d);.  }..  /* Ge
13430 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
13440 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
13450 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
13460 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
13470 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
13480 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
13490 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
134a0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
134b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
134c0 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
134d0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
134e0 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
134f0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
13500 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
13510 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13520 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
13530 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  lEnd);.  }else{ 
13540 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d   .    addrEofA =
13550 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13560 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
13570 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  EofB, labelEnd);
13580 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
135a0 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
135b0 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c 69  rOutB);.    sqli
135c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
135d0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
135e0 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drB);.    sqlite
135f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13600 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
13610 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofA);.  }..  /* 
13620 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
13630 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
13640 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
13650 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
13660 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
13670 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
13680 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
13690 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
136a0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
136b0 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
136c0 61 64 64 72 45 6f 66 41 3b 0a 20 20 7d 65 6c 73  addrEofA;.  }els
136d0 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
136e0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
136f0 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
13700 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
13710 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13720 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
13730 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofA, labelEnd)
13740 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13750 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13760 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
13770 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c  drOutA);.    sql
13780 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13790 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
137a0 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrA);.    sqlit
137b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
137c0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
137d0 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EofB);.  }..  /*
137e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
137f0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
13800 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20  e of A<B.  */.  
13810 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
13820 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72  (v, "A-lt-B subr
13830 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
13840 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAltB = sqlite3V
13850 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13860 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
13870 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c  addrOutA);.  sql
13880 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13890 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
138a0 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
138b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
138c0 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64  _If, regEofA, ad
138d0 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  drEofA);.  sqlit
138e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
138f0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
13900 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65  lCmpr);..  /* Ge
13910 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
13920 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
13930 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66  f A==B.  */.  if
13940 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
13950 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
13960 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65  ddrAltB;.  }else
13970 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
13980 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
13990 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
139a0 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b  ;.    addrAltB++
139b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
139c0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
139d0 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f  v, "A-eq-B subro
139e0 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
139f0 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c  drAeqB =.    sql
13a00 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13a10 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
13a20 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrA);.    sqlit
13a30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13a40 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
13a50 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 73  addrEofA);.    s
13a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13a70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
13a80 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a  labelCmpr);.  }.
13a90 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
13aa0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
13ab0 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20  e case of A>B.  
13ac0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
13ad0 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42  ment((v, "A-gt-B
13ae0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
13af0 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c    addrAgtB = sql
13b00 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
13b10 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70  ddr(v);.  if( op
13b20 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
13b30 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
13b40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13b50 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
13b60 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
13b70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13b80 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13b90 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
13ba0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13bb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
13bc0 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
13bd0 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fB);.  sqlite3Vd
13be0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
13bf0 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
13c00 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  r);..  /* This c
13c10 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ode runs once to
13c20 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72   initialize ever
13c30 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73  ything..  */.  s
13c40 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13c50 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c  re(v, j1);.  sql
13c60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13c70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
13c80 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c   regEofA);.  sql
13c90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13ca0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
13cb0 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c   regEofB);.  sql
13cc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13cd0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41  , OP_Gosub, regA
13ce0 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65 63 74  ddrA, addrSelect
13cf0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
13d00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13d10 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c 20 61  sub, regAddrB, a
13d20 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 73  ddrSelectB);.  s
13d30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13d40 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
13d50 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
13d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13d70 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
13d80 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  EofB, addrEofB);
13d90 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74  ..  /* Implement
13da0 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20   the main merge 
13db0 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
13dc0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
13dd0 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  bel(v, labelCmpr
13de0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13df0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72  AddOp4(v, OP_Per
13e00 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  mutation, 0, 0, 
13e10 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75  0, (char*)aPermu
13e20 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  te, P4_INTARRAY)
13e30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13e40 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
13e50 61 72 65 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c  are, destA.iMem,
13e60 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72   destB.iMem, nOr
13e70 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e90 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65  (char*)pKeyMerge
13ea0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
13eb0 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  DOFF);.  sqlite3
13ec0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13ed0 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
13ee0 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
13ef0 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  gtB);..  /* Rele
13f00 61 73 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65  ase temporary re
13f10 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69  gisters.  */.  i
13f20 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20  f( regPrev ){.  
13f30 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
13f40 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
13f50 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f 72 64 65  , regPrev, nOrde
13f60 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rBy+1);.  }..  /
13f70 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
13f80 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
13f90 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
13fa0 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
13fb0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
13fc0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
13fd0 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  lEnd);..  /* Set
13fe0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
13ff0 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20  utput columns.  
14000 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
14010 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
14020 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  t ){.    Select 
14030 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72  *pFirst = pPrior
14040 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46 69  ;.    while( pFi
14050 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
14060 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
14070 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72  Prior;.    gener
14080 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
14090 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
140a0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  ->pEList);.  }..
140b0 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20    /* Reassembly 
140c0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
140d0 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ry so that it wi
140e0 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72  ll be freed corr
140f0 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
14100 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
14110 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  on */.  if( p->p
14120 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  Prior ){.    sql
14130 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
14140 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b  (db, p->pPrior);
14150 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72  .  }.  p->pPrior
14160 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a   = pPrior;..  /*
14170 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20  ** TBD:  Insert 
14180 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  subroutine calls
14190 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72   to close cursor
141a0 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a  s on incomplete.
141b0 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65    **** subquerie
141c0 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65 74 75 72 6e  s ****/.  return
141d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
141e0 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
141f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
14200 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
14210 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14220 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72  _VIEW)./* Forwar
14230 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
14240 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
14250 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69  bstExprList(sqli
14260 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c  te3*, ExprList*,
14270 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29   int, ExprList*)
14280 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
14290 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65  bstSelect(sqlite
142a0 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e  3*, Select *, in
142b0 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a  t, ExprList *);.
142c0 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
142d0 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
142e0 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
142f0 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
14300 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
14310 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
14320 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
14330 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
14340 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
14350 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
14360 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
14370 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
14380 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
14390 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
143a0 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
143b0 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
143c0 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
143d0 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
143e0 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
143f0 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
14400 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
14410 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
14420 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
14430 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
14440 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
14450 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
14460 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
14470 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
14480 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
14490 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
144a0 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
144b0 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
144c0 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
144d0 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
144e0 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
144f0 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
14500 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
14510 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
14520 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
14530 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c  substExpr(.  sql
14540 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
14550 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
14560 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73  c errors to this
14570 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
14580 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
14590 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20       /* Expr in 
145a0 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69  which substituti
145b0 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69  on occurs */.  i
145c0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
145d0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
145e0 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
145f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
14600 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69  ist    /* Substi
14610 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  tute expressions
14620 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
14630 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
14640 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
14650 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
14660 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
14670 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
14680 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
14690 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
146a0 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
146b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
146c0 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
146d0 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
146e0 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
146f0 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
14700 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
14710 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
14720 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
14730 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
14740 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
14750 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c  3ExprDup(db, pEL
14760 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
14770 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29  olumn].pExpr, 0)
14780 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
14790 20 26 26 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c   && pExpr->pColl
147a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
147b0 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d  ->pColl = pExpr-
147c0 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pColl;.      }.
147d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
147e0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
147f0 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20  r);.      pExpr 
14800 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
14810 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72  }else{.    pExpr
14820 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
14830 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
14840 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
14850 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72  List);.    pExpr
14860 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
14870 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
14880 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
14890 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
148a0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
148b0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
148c0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
148d0 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
148e0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
148f0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
14900 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14910 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
14920 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (db, pExpr->x.pL
14930 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
14940 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
14950 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
14960 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
14970 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73  bstExprList(.  s
14980 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
14990 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
149a0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
149b0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
149c0 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69  pList,     /* Li
149d0 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
149e0 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
149f0 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20  substitutes */. 
14a00 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
14a10 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
14a20 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
14a30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
14a40 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
14a50 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
14a60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
14a70 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
14a80 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
14a90 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
14aa0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
14ab0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
14ac0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
14ad0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14ae0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14af0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
14b00 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
14b10 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
14b20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
14b30 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
14b40 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
14b50 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
14b60 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
14b70 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
14b80 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
14b90 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
14ba0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
14bb0 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c  Table to be repl
14bc0 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  aced */.  ExprLi
14bd0 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
14be0 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
14bf0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  ues */.){.  SrcL
14c00 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
14c10 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
14c20 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
14c30 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
14c40 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72  urn;.  substExpr
14c50 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69  List(db, p->pELi
14c60 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
14c70 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
14c80 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f  List(db, p->pGro
14c90 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
14ca0 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
14cb0 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f  prList(db, p->pO
14cc0 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
14cd0 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48  pEList);.  p->pH
14ce0 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
14cf0 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
14d00 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14d10 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  );.  p->pWhere =
14d20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
14d30 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
14d40 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
14d50 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e  stSelect(db, p->
14d60 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20  pPrior, iTable, 
14d70 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20  pEList);.  pSrc 
14d80 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
14d90 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a  ert( pSrc );  /*
14da0 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43   Even for (SELEC
14db0 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53  T 1) we have: pS
14dc0 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e  rc!=0 but pSrc->
14dd0 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28  nSrc==0 */.  if(
14de0 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b   ALWAYS(pSrc) ){
14df0 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
14e00 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
14e10 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
14e20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
14e30 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
14e40 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
14e50 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
14e60 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
14e70 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
14e80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
14e90 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
14ea0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
14eb0 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
14ec0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14ed0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
14ee0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14ef0 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
14f00 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
14f10 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
14f20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72  subqueries in or
14f30 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20  der to speed.** 
14f40 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72  execution.  It r
14f50 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
14f60 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
14f70 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
14f80 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ing.** occurs..*
14f90 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
14fa0 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
14fb0 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
14fc0 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
14fd0 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
14fe0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
14ff0 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
15000 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
15010 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
15020 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
15030 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
15040 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
15050 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
15060 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
15070 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
15080 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
15090 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
150a0 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
150b0 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
150c0 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
150d0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
150e0 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
150f0 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
15100 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
15110 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
15120 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
15130 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
15140 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
15150 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
15160 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
15170 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
15180 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
15190 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
151a0 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
151b0 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
151c0 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
151d0 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
151e0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
151f0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
15200 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
15210 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
15220 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
15230 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
15240 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
15250 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
15260 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
15270 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
15280 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
15290 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
152a0 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
152b0 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
152c0 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
152d0 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
152e0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
152f0 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
15300 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
15310 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
15320 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
15330 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
15340 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
15350 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
15360 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
15370 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
15380 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
15390 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
153a0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
153b0 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
153c0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
153d0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
153e0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
153f0 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
15400 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
15410 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20  t outer join.** 
15420 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c         (Original
15430 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20  ly ticket #306. 
15440 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79   Strengthened by
15450 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a   ticket #3300).*
15460 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
15470 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
15480 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
15490 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
154a0 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
154b0 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
154c0 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
154d0 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
154e0 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
154f0 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
15500 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
15510 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
15520 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
15530 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
15540 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
15550 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
15560 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
15570 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
15580 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
15590 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
155a0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
155b0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
155c0 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
155d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
155e0 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
155f0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  a FROM clause..*
15600 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
15610 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
15620 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
15630 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
15640 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
15650 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
15660 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
15670 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
15680 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
15690 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
156a0 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
156b0 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68  .**.**  (10)  Th
156c0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
156d0 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
156e0 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
156f0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
15700 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d  *        use LIM
15710 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  IT..**.**  (11) 
15720 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
15730 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
15740 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61  y do not both ha
15750 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
15760 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
15770 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
15780 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
15790 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
157a0 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
157b0 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
157c0 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
157d0 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
157e0 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
157f0 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
15800 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
15810 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
15820 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
15830 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
15840 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
15850 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
15860 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20  *.**  (15)  The 
15870 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
15880 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ot part of a com
15890 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20  pound select or 
158a0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
158b0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
158c0 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  have a LIMIT cla
158d0 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28  use..**        (
158e0 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39  See ticket #2339
158f0 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61   and ticket [02a
15900 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a  8e81d44])..**.**
15910 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65    (16)  The oute
15920 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
15930 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
15940 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
15950 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63  .**        not c
15960 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e  ontain ORDER BY.
15970 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
15980 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
15990 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
159a0 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
159b0 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
159c0 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
159d0 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
159e0 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72  7)  The sub-quer
159f0 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f  y is not a compo
15a00 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69  und select, or i
15a10 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t is a UNION ALL
15a20 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70   .**        comp
15a30 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65  ound clause made
15a40 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20   up entirely of 
15a50 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
15a60 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20  eries, and .**  
15a70 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74        the parent
15a80 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
15a90 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
15aa0 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61  itself part of a
15ab0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
15ac0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  ,.**          * 
15ad0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
15ae0 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20  ate or DISTINCT 
15af0 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20  query, and.**   
15b00 20 20 20 20 20 20 20 2a 20 68 61 73 20 6e 6f 20         * has no 
15b10 6f 74 68 65 72 20 74 61 62 6c 65 73 20 6f 72 20  other tables or 
15b20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 74  sub-selects in t
15b30 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
15b40 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
15b50 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
15b60 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
15b70 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
15b80 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
15b90 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
15ba0 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
15bb0 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
15bc0 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
15bd0 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
15be0 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
15bf0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  ses..**.**  (18)
15c00 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
15c10 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
15c20 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
15c30 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
15c40 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62  *        ORDER b
15c50 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  y clause of the 
15c60 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
15c70 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
15c80 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
15c90 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
15ca0 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
15cb0 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65  (19)  The subque
15cc0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
15cd0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
15ce0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
15cf0 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
15d00 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
15d10 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
15d20 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
15d30 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
15d40 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
15d50 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
15d60 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
15d70 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
15d80 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
15d90 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
15da0 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
15db0 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
15dc0 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
15dd0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
15de0 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
15df0 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
15e00 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
15e10 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
15e20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
15e30 20 20 42 75 74 0a 2a 2a 20 20 20 20 20 20 20 20    But.**        
15e40 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
15e50 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
15e60 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
15e70 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  at case..**.** I
15e80 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
15e90 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
15ea0 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
15eb0 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
15ec0 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
15ed0 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
15ee0 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
15ef0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
15f00 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
15f10 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
15f20 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
15f30 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
15f40 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
15f50 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
15f60 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
15f70 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
15f80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
15f90 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
15fa0 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
15fb0 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
15fc0 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
15fd0 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
15fe0 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
15ff0 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
16000 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
16010 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
16020 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
16030 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
16040 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
16050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16060 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
16070 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16080 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
16090 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
160a0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
160b0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
160c0 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
160d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
160e0 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
160f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
16100 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
16110 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
16120 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
16130 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
16140 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
16150 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
16160 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
16170 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
16180 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
16190 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
161a0 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
161b0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
161c0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
161d0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
161e0 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
161f0 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
16200 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53  ct *pParent;.  S
16210 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
16220 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
16230 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
16240 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
16250 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
16260 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
16270 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
16280 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
16290 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
162a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
162b0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
162c0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
162d0 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
162e0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
162f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
16300 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
16310 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
16320 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
16330 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
16340 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
16350 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
16360 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
16370 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
16380 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
16390 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
163a0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
163b0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
163c0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
163d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
163e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
163f0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
16400 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
16410 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
16420 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
16430 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
16440 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
16450 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
16460 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
16470 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
16480 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
16490 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
164a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
164b0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
164c0 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66    /* Unable to f
164d0 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20  latten compound 
164e0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28  queries */.  if(
164f0 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
16500 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
16510 65 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  er ) return 0;. 
16520 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
16530 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
16540 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
16550 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
16560 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
16570 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
16580 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
16590 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
165a0 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
165b0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
165c0 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
165d0 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
165e0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
165f0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
16600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16610 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f  triction (1)  */
16620 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
16630 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
16640 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
16650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16660 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f  triction (2)  */
16670 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
16680 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
16690 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
166a0 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
166b0 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
166c0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
166d0 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
166e0 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
166f0 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
16700 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65  expresssions, we
16710 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
16720 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
16730 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
16740 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
16750 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
16760 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
16770 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
16780 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
16790 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
167a0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
167b0 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
167c0 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
167d0 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
167e0 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
167f0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
16800 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
16810 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
16820 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16830 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
16840 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72  Sub->pOffset ) r
16850 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16880 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70   (14) */.  if( p
16890 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20  ->pRightmost && 
168a0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
168b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
168f0 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
16900 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
16910 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
16920 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16940 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
16950 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
16960 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
16970 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
16980 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
16990 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20  Restriction (5) 
169a0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
169b0 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d  pLimit && (pSrc-
169c0 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
169d0 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
169e0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
169f0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28  estrictions (8)(
16a00 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  9) */.  }.  if( 
16a10 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
16a20 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26  F_Distinct)!=0 &
16a30 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
16a40 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
16a50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
16a60 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f  triction (6)  */
16a70 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
16a80 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e  rderBy && pSub->
16a90 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
16aa0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ad0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
16ae0 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a  ion (11) */.  }.
16af0 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70    if( isAgg && p
16b00 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
16b10 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
16b20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
16b30 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a  riction (16) */.
16b40 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
16b50 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20  it && p->pWhere 
16b60 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
16b70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
16b80 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a  riction (19) */.
16b90 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  /* OBSOLETE C
16ba0 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52  OMMENT 1:.  ** R
16bb0 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
16bc0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
16bd0 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
16be0 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
16bf0 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
16c00 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
16c10 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
16c20 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
16c30 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
16c40 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
16c50 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
16c60 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
16c70 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
16c80 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
16c90 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
16ca0 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
16cb0 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
16cc0 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
16cd0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
16ce0 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
16cf0 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
16d00 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
16d10 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  thing..  **.  **
16d20 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
16d30 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 2:.  ** Restri
16d40 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
16d50 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
16d60 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
16d70 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
16d80 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
16d90 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
16da0 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
16db0 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
16dc0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
16dd0 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
16de0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
16df0 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
16e00 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
16e10 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
16e20 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
16e30 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
16e40 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
16e50 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
16e60 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
16e70 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
16e80 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
16e90 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
16ea0 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
16eb0 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
16ec0 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
16ed0 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
16ee0 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
16ef0 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
16f00 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
16f10 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   JOIN..  **.  **
16f20 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53 20   THIS OVERRIDES 
16f30 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
16f40 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a  S 1 AND 2 ABOVE:
16f50 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33  .  ** Ticket #33
16f60 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c  00 shows that fl
16f70 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67  attening the rig
16f80 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
16f90 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66  T JOIN.  ** is f
16fa0 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e 67  raught with dang
16fb0 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f  er.  Best to avo
16fc0 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  id the whole thi
16fd0 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  ng.  If the.  **
16fe0 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
16ff0 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
17000 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
17010 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
17020 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75  .  */.  if( (pSu
17030 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
17040 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
17050 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
17060 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
17070 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65  ction 17: If the
17080 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
17090 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c  compound SELECT,
170a0 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20   then it must.  
170b0 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20  ** use only the 
170c0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
170d0 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20  or. And none of 
170e0 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63  the simple selec
170f0 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  t queries.  ** t
17100 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
17110 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
17120 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  are allowed to b
17130 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64  e aggregate or d
17140 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65  istinct.  ** que
17150 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ries..  */.  if(
17160 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b   pSub->pPrior ){
17170 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
17180 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
17190 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52   return 0;  /* R
171a0 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f  estriction 20 */
171b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
171c0 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46  sAgg || (p->selF
171d0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
171e0 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e  ct)!=0 || pSrc->
171f0 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  nSrc!=1 ){.     
17200 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
17210 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70  .    for(pSub1=p
17220 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62  Sub; pSub1; pSub
17230 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29  1=pSub1->pPrior)
17240 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
17250 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
17260 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
17270 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
17280 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
17290 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
172a0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
172b0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
172c0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
172d0 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
172e0 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62  .      if( (pSub
172f0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
17300 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
17310 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20  gregate))!=0.   
17320 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
17330 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
17340 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20  op!=TK_ALL) .   
17350 20 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 53 75      || NEVER(pSu
17360 62 31 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20  b1->pSrc==0) || 
17370 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
17380 63 21 3d 31 0a 20 20 20 20 20 20 29 7b 0a 20 20  c!=1.      ){.  
17390 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
173a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
173b0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
173c0 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28  n 18. */.    if(
173d0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
173e0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
173f0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
17400 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
17410 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
17420 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
17430 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 43 6f 6c 3d  rBy->a[ii].iCol=
17440 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17450 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17460 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
17470 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
17480 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
17490 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
174a0 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69  */..  /* Authori
174b0 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ze the subquery 
174c0 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  */.  pParse->zAu
174d0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62  thContext = pSub
174e0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73  item->zName;.  s
174f0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
17500 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
17510 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
17520 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
17530 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
17540 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  AuthContext;..  
17550 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  /* If the sub-qu
17560 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
17570 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
17580 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73  nt, then (by res
17590 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31  trictions.  ** 1
175a0 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20  7 and 18 above) 
175b0 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49  it must be a UNI
175c0 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70  ON ALL and the p
175d0 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74  arent query must
175e0 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65   .  ** be of the
175f0 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   form:.  **.  **
17600 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70       SELECT <exp
17610 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73  r-list> FROM (<s
17620 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72  ub-query>) <wher
17630 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a  e-clause> .  **.
17640 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79    ** followed by
17650 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
17660 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53  IMIT and/or OFFS
17670 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73  ET clauses. This
17680 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61   block.  ** crea
17690 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f  tes N-1 copies o
176a0 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  f the parent que
176b0 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f  ry without any O
176c0 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f  RDER BY, LIMIT o
176d0 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63  r .  ** OFFSET c
176e0 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73  lauses and joins
176f0 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66   them to the lef
17700 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74  t-hand-side of t
17710 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
17720 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c   using UNION ALL
17730 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74   operators. In t
17740 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68  his case N is th
17750 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70  e number of simp
17760 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73  le.  ** select s
17770 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
17780 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
17790 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ery..  **.  ** E
177a0 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
177b0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31  *     SELECT a+1
177c0 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20   FROM (.  **    
177d0 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
177e0 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
177f0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
17800 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79          SELECT y
17810 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
17820 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
17830 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
17840 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d  CT abs(z*2) FROM
17850 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29   tab2.  **     )
17860 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45   WHERE a!=5 ORDE
17870 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
17880 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
17890 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
178a0 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d   SELECT x+1 FROM
178b0 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d   tab WHERE x+1!=
178c0 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
178d0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
178e0 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61  LECT y+1 FROM ta
178f0 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20  b WHERE y+1!=5. 
17900 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
17910 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
17920 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f  T abs(z*2)+1 FRO
17930 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73  M tab2 WHERE abs
17940 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20  (z*2)+1!=5.  ** 
17950 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20      ORDER BY 1. 
17960 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c   **.  ** We call
17970 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f   this the "compo
17980 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
17990 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20  ttening"..  */. 
179a0 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e   for(pSub=pSub->
179b0 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53  pPrior; pSub; pS
179c0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
179d0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
179e0 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ew;.    ExprList
179f0 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
17a00 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78  pOrderBy;.    Ex
17a10 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
17a20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65  pLimit;.    Sele
17a30 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
17a40 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
17a50 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
17a60 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20   p->pSrc = 0;.  
17a70 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
17a80 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
17a90 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   0;.    pNew = s
17aa0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
17ab0 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70  db, p, 0);.    p
17ac0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
17ad0 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  t;.    p->pOrder
17ae0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
17af0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
17b00 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  c;.    p->op = T
17b10 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52  K_ALL;.    p->pR
17b20 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
17b30 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
17b40 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 50  .      pNew = pP
17b50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
17b60 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
17b70 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
17b80 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
17b90 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  most = 0;.    }.
17ba0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
17bb0 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 64 62  pNew;.    if( db
17bc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17bd0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
17be0 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74    /* Begin flatt
17bf0 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d  ening the iFrom-
17c00 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
17c10 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a  FROM clause .  *
17c20 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  * in the outer q
17c30 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75  uery..  */.  pSu
17c40 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62  b = pSub1 = pSub
17c50 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a  item->pSelect;..
17c60 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
17c70 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
17c80 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69  structure associ
17c90 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
17ca0 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f  ** subquery.  */
17cb0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
17cc0 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
17cd0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c  Database);.  sql
17ce0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
17cf0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
17d00 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
17d10 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
17d20 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74  Alias);.  pSubit
17d30 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
17d40 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
17d50 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  Name = 0;.  pSub
17d60 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30  item->zAlias = 0
17d70 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  ;.  pSubitem->pS
17d80 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  elect = 0;..  /*
17d90 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20   Defer deleting 
17da0 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
17db0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
17dc0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
17dd0 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65  ry until code ge
17de0 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  neration is.  **
17df0 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65   complete, since
17e00 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c   there may still
17e10 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62   exist Expr.pTab
17e20 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20   entries that.  
17e30 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ** refer to the 
17e40 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66  subquery even af
17e50 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  ter flattening. 
17e60 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20   Ticket #3346.. 
17e70 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65   **.  ** pSubite
17e80 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79  m->pTab is alway
17e90 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65  s non-NULL by te
17ea0 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  st restrictions 
17eb0 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e  and tests above.
17ec0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  .  */.  if( ALWA
17ed0 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  YS(pSubitem->pTa
17ee0 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62  b!=0) ){.    Tab
17ef0 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20  le *pTabToDel = 
17f00 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a  pSubitem->pTab;.
17f10 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65      if( pTabToDe
17f20 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20  l->nRef==1 ){.  
17f30 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c      Parse *pTopl
17f40 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
17f50 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
17f60 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54  se);.      pTabT
17f70 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69  oDel->pNextZombi
17f80 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70  e = pToplevel->p
17f90 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20  ZombieTab;.     
17fa0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
17fb0 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44  bieTab = pTabToD
17fc0 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  el;.    }else{. 
17fd0 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
17fe0 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nRef--;.    }.  
17ff0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
18000 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
18010 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
18020 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
18030 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
18040 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
18050 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
18060 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
18070 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
18080 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
18090 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
180a0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
180b0 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
180c0 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
180d0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
180e0 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
180f0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
18100 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
18110 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
18120 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
18130 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
18140 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
18150 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
18160 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
18170 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
18180 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
18190 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
181a0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
181b0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
181c0 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
181d0 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
181e0 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
181f0 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
18200 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
18210 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
18220 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
18230 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
18240 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
18250 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
18260 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
18270 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
18280 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
18290 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
182a0 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
182b0 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
182c0 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
182d0 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
182e0 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
182f0 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
18300 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
18310 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
18320 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
18330 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
18340 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
18350 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
18360 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
18370 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
18380 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
18390 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
183a0 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
183b0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
183c0 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
183d0 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
183e0 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
183f0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
18400 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
18410 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
18420 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
18430 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
18440 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
18450 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
18460 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
18470 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
18480 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
18490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
184a0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
184b0 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e  =p );  /* 2nd an
184c0 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d  d subsequent tim
184d0 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  es through the l
184e0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72  oop */.      pSr
184f0 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
18500 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
18510 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
18520 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
18530 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pSrc==0 ){.    
18540 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
18550 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
18560 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18570 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
18580 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
18590 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  y uses a single 
185a0 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  slot of the FROM
185b0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
185c0 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72  uter.    ** quer
185d0 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75  y.  If the subqu
185e0 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61  ery has more tha
185f0 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e  n one element in
18600 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
18610 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78  ,.    ** then ex
18620 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
18630 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61  uery to make spa
18640 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c  ce for it to hol
18650 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20  d all elements. 
18660 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62     ** of the sub
18670 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
18680 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
18690 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
186a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
186b0 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  A, (SELECT * FRO
186c0 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74  M sub1, sub2), t
186d0 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  abB;.    **.    
186e0 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  ** The outer que
186f0 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69  ry has 3 slots i
18700 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
18710 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20  e.  One slot of 
18720 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
18730 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64   query (the midd
18740 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64  le slot) is used
18750 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79   by the subquery
18760 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  .  The next.    
18770 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ** block of code
18780 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65   will expand the
18790 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34 20   out query to 4 
187a0 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64  slots.  The midd
187b0 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69  le.    ** slot i
187c0 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
187d0 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
187e0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
187f0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77  or the.    ** tw
18800 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
18810 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
18820 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
18830 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
18840 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
18850 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
18860 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
18870 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
18880 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
18890 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
188a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
188b0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
188c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
188d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
188e0 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
188f0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
18900 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
18910 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
18920 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
18930 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
18940 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
18950 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
18960 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
18970 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
18980 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
18990 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
189a0 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
189b0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
189c0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
189d0 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
189e0 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
189f0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
18a00 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  m].jointype = jo
18a10 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f  intype;.  .    /
18a20 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
18a30 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
18a40 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
18a50 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
18a60 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
18a70 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
18a80 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
18a90 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  y..    ** .    *
18aa0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
18ab0 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
18ac0 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
18ad0 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
18ae0 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
18af0 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
18b00 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  .    **   \     
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
18b30 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
18b40 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
18b50 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f     **    \______
18b60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
18b70 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
18b80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18b90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20  __________/.    
18ba0 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f  **.    ** We loo
18bb0 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
18bc0 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
18bd0 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
18be0 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
18bf0 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75      ** "a" we su
18c00 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
18c10 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
18c20 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
18c30 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
18c40 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74      */.    pList
18c50 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69   = pParent->pELi
18c60 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
18c70 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
18c80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
18c90 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
18ca0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
18cb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
18cc0 61 6e 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  an = pList->a[i]
18cd0 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
18ce0 69 66 28 20 41 4c 57 41 59 53 28 7a 53 70 61 6e  if( ALWAYS(zSpan
18cf0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
18d00 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
18d10 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
18d20 75 70 28 64 62 2c 20 7a 53 70 61 6e 29 3b 0a 20  up(db, zSpan);. 
18d30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18d40 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74  .    }.    subst
18d50 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
18d60 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50  rent->pEList, iP
18d70 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
18d80 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ist);.    if( is
18d90 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62  Agg ){.      sub
18da0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
18db0 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
18dc0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
18dd0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
18de0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
18df0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
18e00 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
18e10 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
18e20 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
18e30 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
18e40 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
18e50 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
18e60 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
18e70 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
18e80 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
18e90 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
18ea0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
18eb0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
18ec0 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  f( pParent->pOrd
18ed0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75  erBy ){.      su
18ee0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
18ef0 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
18f00 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
18f10 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
18f20 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
18f30 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70  Where ){.      p
18f40 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
18f50 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
18f60 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  >pWhere, 0);.   
18f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
18f80 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  here = 0;.    }.
18f90 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79      if( subquery
18fa0 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61  IsAgg ){.      a
18fb0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
18fc0 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
18fd0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
18fe0 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e  ving = pParent->
18ff0 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
19000 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
19010 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
19020 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
19030 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
19040 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
19050 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
19060 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
19070 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
19080 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
19090 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
190a0 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20  aving, .        
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
190d0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
190e0 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29 3b  b->pHaving, 0));
190f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19100 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
19110 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
19120 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d  rent->pGroupBy =
19130 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
19140 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47  Dup(db, pSub->pG
19150 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20  roupBy, 0);.    
19160 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
19170 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
19180 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
19190 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50  rent->pWhere, iP
191a0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
191b0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
191c0 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  ent->pWhere = sq
191d0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
191e0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
191f0 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d  , pWhere);.    }
19200 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  .  .    /* The f
19210 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
19220 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
19230 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
19240 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  r the.    ** out
19250 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
19260 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  inct. .    */.  
19270 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c    pParent->selFl
19280 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c  ags |= pSub->sel
19290 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
192a0 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  nct;.  .    /*. 
192b0 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
192c0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
192d0 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
192e0 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
192f0 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
19300 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
19310 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
19320 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
19330 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
19340 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
19350 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
19360 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
19370 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
19380 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
19390 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
193a0 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
193b0 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
193c0 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
193d0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
193e0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
193f0 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
19400 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
19410 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
19420 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
19430 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
19440 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
19450 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Sub1);..  return
19460 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
19470 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
19480 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
19490 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
194a0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
194b0 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
194c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
194d0 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
194e0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65   argument to see
194f0 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d   if it.** is a m
19500 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
19510 65 72 79 2e 20 52 65 74 75 72 6e 20 57 48 45 52  ery. Return WHER
19520 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72  E_ORDERBY_MIN or
19530 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
19540 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c  AX if .** it is,
19550 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e   or 0 otherwise.
19560 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71   At present, a q
19570 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72  uery is consider
19580 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69  ed to be.** a mi
19590 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20  n()/max() query 
195a0 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54  if:.**.**   1. T
195b0 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65  here is a single
195c0 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46   object in the F
195d0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
195e0 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69 73 20  *   2. There is 
195f0 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73  a single express
19600 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
19610 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73  t set, and it is
19620 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72 20  .**      either 
19630 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29  min(x) or max(x)
19640 2c 20 77 68 65 72 65 20 78 20 69 73 20 61 20 63  , where x is a c
19650 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e  olumn reference.
19660 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69  .*/.static u8 mi
19670 6e 4d 61 78 51 75 65 72 79 28 53 65 6c 65 63 74  nMaxQuery(Select
19680 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45   *p){.  Expr *pE
19690 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  xpr;.  ExprList 
196a0 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
196b0 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69  ist;..  if( pELi
196c0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
196d0 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
196e0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45  RBY_NORMAL;.  pE
196f0 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  xpr = pEList->a[
19700 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
19710 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
19720 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
19730 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56  urn 0;.  if( NEV
19740 45 52 28 45 78 70 72 48 61 73 50 72 6f 70 65 72  ER(ExprHasProper
19750 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
19760 53 65 6c 65 63 74 29 29 20 29 20 72 65 74 75 72  Select)) ) retur
19770 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  n 0;.  pEList = 
19780 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
19790 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
197a0 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  || pEList->nExpr
197b0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
197c0 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
197d0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  0].pExpr->op!=TK
197e0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  _AGG_COLUMN ) re
197f0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
19800 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 61 73 73  BY_NORMAL;.  ass
19810 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
19820 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
19830 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 69  IntValue) );.  i
19840 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
19850 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
19860 6e 2c 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20  n,"min")==0 ){. 
19870 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f     return WHERE_
19880 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d  ORDERBY_MIN;.  }
19890 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
198a0 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
198b0 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 78 22 29 3d 3d  .zToken,"max")==
198c0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
198d0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
198e0 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  X;.  }.  return 
198f0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
19900 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RMAL;.}../*.** T
19910 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
19920 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
19930 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
19940 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
19950 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
19960 65 63 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73  econd argment is
19970 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
19980 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
19990 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
199a0 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
199b0 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
199c0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
199d0 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
199e0 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
199f0 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
19a00 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
19a10 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
19a20 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
19a30 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
19a40 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
19a50 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
19a60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19a70 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
19a80 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
19a90 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
19aa0 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
19ab0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
19ac0 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
19ad0 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
19ae0 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
19af0 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
19b00 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
19b10 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
19b20 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
19b30 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
19b40 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
19b50 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
19b60 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
19b70 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
19b80 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
19b90 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19ba0 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
19bb0 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
19bc0 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
19bd0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
19be0 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
19bf0 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
19c00 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
19c10 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
19c20 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
19c30 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
19c40 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
19c50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
19c60 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
19c70 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 6c 61  nc[0].pFunc->fla
19c80 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
19c90 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
19ca0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
19cb0 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
19cc0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
19cd0 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
19ce0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
19cf0 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
19d00 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
19d10 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
19d20 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
19d30 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
19d40 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
19d50 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
19d60 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
19d70 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
19d80 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
19d90 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
19da0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
19db0 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
19dc0 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
19dd0 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
19de0 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
19df0 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
19e00 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
19e10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
19e20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
19e30 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
19e40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
19e50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19e60 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
19e70 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
19e80 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a  From->zIndex ){.
19e90 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
19ea0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
19eb0 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20     char *zIndex 
19ec0 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b  = pFrom->zIndex;
19ed0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
19ee0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
19ef0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
19f00 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
19f10 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
19f20 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
19f30 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
19f40 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
19f50 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
19f60 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
19f70 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19f80 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
19f90 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20  x: %s", zIndex, 
19fa0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
19fb0 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
19fc0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
19fd0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
19fe0 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
19ff0 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
1a000 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1a010 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1a020 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1a030 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
1a040 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22   for "expanding"
1a050 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1a060 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69  ent..** "Expandi
1a070 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  ng" means to do 
1a080 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
1a090 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
1a0a0 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
1a0b0 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
1a0c0 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
1a0d0 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
1a0e0 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
1a0f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
1a100 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
1a110 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
1a120 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
1a130 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
1a140 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
1a150 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
1a160 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
1a170 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
1a180 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
1a190 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
1a1a0 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
1a1b0 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
1a1c0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
1a1d0 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
1a1e0 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
1a1f0 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
1a200 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
1a210 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
1a220 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
1a230 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
1a240 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
1a250 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
1a260 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
1a270 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
1a280 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
1a290 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72  essing up the pr
1a2a0 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  esistent represe
1a2b0 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
1a2c0 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
1a2d0 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
1a2e0 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
1a2f0 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
1a300 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  ccomodate the NA
1a310 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
1a320 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
1a330 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
1a340 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1a350 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
1a360 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
1a370 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
1a380 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1a390 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
1a3a0 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
1a3b0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
1a3c0 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
1a3d0 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
1a3e0 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
1a3f0 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
1a400 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
1a410 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
1a420 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
1a430 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
1a440 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
1a450 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
1a460 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
1a470 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
1a480 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
1a490 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
1a4a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
1a4b0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
1a4c0 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
1a4d0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1a4e0 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
1a4f0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
1a500 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1a510 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
1a520 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1a530 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  >db;..  if( db->
1a540 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b  mallocFailed  ){
1a550 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1a560 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Abort;.  }.  if(
1a570 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d   NEVER(p->pSrc==
1a580 30 29 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  0) || (p->selFla
1a590 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
1a5a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
1a5b0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1a5c0 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  }.  p->selFlags 
1a5d0 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
1a5e0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1a5f0 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
1a600 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
1a610 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
1a620 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
1a630 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
1a640 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
1a650 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
1a660 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
1a670 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
1a680 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
1a690 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1a6a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1a6b0 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  t);..  /* Look u
1a6c0 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
1a6d0 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
1a6e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
1a6f0 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
1a700 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
1a710 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
1a720 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
1a730 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
1a740 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
1a750 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
1a760 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
1a770 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
1a780 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
1a790 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
1a7a0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
1a7b0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1a7c0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
1a7d0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
1a7e0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
1a7f0 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
1a800 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   /* This stateme
1a810 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  nt has already b
1a820 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54  een prepared.  T
1a830 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
1a840 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66        ** to go f
1a850 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  urther. */.     
1a860 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b   assert( i==0 );
1a870 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
1a880 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
1a890 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
1a8a0 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
1a8b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1a8c0 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c  BQUERY.      Sel
1a8d0 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
1a8e0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
1a8f0 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
1a900 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1a910 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1a920 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1a930 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20   pSel!=0 );.    
1a940 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1a950 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
1a960 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1a970 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
1a980 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  l);.      pFrom-
1a990 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
1a9a0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1a9b0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
1a9c0 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
1a9d0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
1a9e0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1a9f0 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
1aa00 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  1;.      pTab->z
1aa10 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
1aa20 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
1aa30 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c  e_subquery_%p_",
1aa40 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20   (void*)pTab);. 
1aa50 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
1aa60 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c  ->pPrior ){ pSel
1aa70 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
1aa80 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43   }.      selectC
1aa90 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
1aaa0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
1aab0 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
1aac0 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
1aad0 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
1aae0 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
1aaf0 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20    pTab->nRowEst 
1ab00 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20 20  = 1000000;.     
1ab10 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
1ab20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
1ab30 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1ab40 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
1ab50 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
1ab60 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
1ab70 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
1ab80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ab90 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
1aba0 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
1abb0 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
1abc0 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
1abd0 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30  teTable(pParse,0
1abe0 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46  ,pFrom->zName,pF
1abf0 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  rom->zDatabase);
1ac00 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1ac10 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1ac20 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
1ac30 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
1ac40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ac50 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
1ac60 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
1ac70 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
1ac80 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
1ac90 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
1aca0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1acb0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
1acc0 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
1acd0 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
1ace0 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
1acf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1ad00 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
1ad10 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1ad20 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
1ad30 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
1ad40 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1ad50 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
1ad60 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
1ad70 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
1ad80 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
1ad90 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
1ada0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
1adb0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1adc0 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
1add0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1ade0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
1adf0 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
1ae00 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
1ae10 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
1ae20 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
1ae30 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
1ae40 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
1ae50 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
1ae60 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
1ae70 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
1ae80 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
1ae90 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
1aea0 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
1aeb0 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
1aec0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
1aed0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
1aee0 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
1aef0 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
1af00 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1af10 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
1af20 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
1af30 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
1af40 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
1af50 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
1af60 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
1af70 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
1af80 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
1af90 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
1afa0 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
1afb0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
1afc0 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
1afd0 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
1afe0 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
1aff0 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
1b000 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
1b010 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
1b020 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
1b030 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
1b040 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
1b050 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
1b060 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
1b070 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
1b080 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
1b090 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
1b0a0 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
1b0b0 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
1b0c0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
1b0d0 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
1b0e0 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
1b0f0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
1b100 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
1b110 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
1b120 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
1b130 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
1b140 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
1b150 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
1b160 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
1b170 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
1b180 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
1b190 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
1b1a0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1b1b0 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
1b1c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b1d0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1b1e0 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
1b1f0 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
1b200 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
1b210 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
1b220 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
1b230 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
1b240 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
1b250 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
1b260 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
1b270 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
1b280 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
1b290 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
1b2a0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
1b2b0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
1b2c0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1b2d0 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
1b2e0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
1b2f0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
1b300 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1b310 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
1b320 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
1b330 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
1b340 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
1b350 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
1b360 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
1b370 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
1b380 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
1b390 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
1b3a0 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
1b3b0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
1b3c0 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3e0 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
1b3f0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
1b400 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
1b410 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
1b420 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
1b430 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
1b440 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
1b450 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
1b460 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1b470 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
1b480 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
1b490 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70  K_ALL && (pE->op
1b4a0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1b4b0 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
1b4c0 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
1b4d0 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
1b4e0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
1b4f0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1b500 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
1b510 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
1b520 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1b530 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1b540 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
1b550 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
1b560 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
1b570 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
1b580 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
1b590 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
1b5a0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
1b5b0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
1b5c0 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
1b5d0 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
1b5e0 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
1b5f0 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
1b600 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
1b610 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
1b620 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
1b630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1b640 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
1b650 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
1b660 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
1b670 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
1b680 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
1b690 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
1b6a0 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
1b6b0 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
1b6c0 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
1b6d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
1b6e0 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20   *zTName;       
1b6f0 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
1b700 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
1b710 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
1b720 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
1b730 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1b740 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b   pE->pLeft!=0 );
1b750 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1b760 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1b770 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45  rty(pE->pLeft, E
1b780 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1b790 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
1b7a0 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  = pE->pLeft->u.z
1b7b0 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  Token;.        }
1b7c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1b7d0 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  zTName = 0;.    
1b7e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
1b7f0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1b800 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1b810 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1b820 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
1b830 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1b840 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
1b850 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1b860 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
1b870 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
1b880 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
1b890 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1b8a0 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
1b8b0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
1b8c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b8d0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1b8e0 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
1b8f0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1b900 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
1b910 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
1b920 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
1b930 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1b940 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
1b950 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
1b960 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
1b970 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1b980 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1b990 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
1b9a0 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74   *pExpr, *pRight
1b9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
1b9c0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
1b9d0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
1b9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1b9f0 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
1ba00 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
1ba10 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
1ba20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1ba30 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
1ba40 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
1ba50 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
1ba60 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
1ba70 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
1ba80 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
1ba90 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
1baa0 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
1bab0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
1bac0 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
1bad0 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
1bae0 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
1baf0 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
1bb00 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
1bb10 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
1bb20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
1bb30 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
1bb40 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
1bb50 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
1bb60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1bb70 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
1bb80 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
1bb90 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
1bba0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1bbb0 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
1bbc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1bbd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1bbe0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1bbf0 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
1bc00 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1bc20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65  (pFrom->jointype
1bc30 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
1bc40 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1bc50 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c    && tableAndCol
1bc60 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
1bc70 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  t, i, zName, 0, 
1bc80 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
1bc90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1bca0 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
1bcb0 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
1bcc0 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
1bcd0 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
1bce0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
1bcf0 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  le to the right 
1bd00 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1bd20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1bd30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bd40 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1bd50 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46  e3IdListIndex(pF
1bd60 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  rom->pUsing, zNa
1bd70 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
1bd80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
1bd90 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
1bda0 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
1bdb0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdd0 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
1bde0 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
1bdf0 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1be20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1be30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1be40 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
1be50 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
1be60 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ID, zName);.    
1be70 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
1be80 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
1be90 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
1bea0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
1beb0 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  f( longNames || 
1bec0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
1bed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1bee0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20    Expr *pLeft;. 
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
1bf00 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
1bf10 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62  (db, TK_ID, zTab
1bf20 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1bf30 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
1bf40 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1bf50 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
1bf60 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
1bf70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
1bf80 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
1bfa0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
1bfb0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
1bfc0 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
1bfd0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1bfe0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
1bff0 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
1c000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c010 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c020 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1c030 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
1c040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c050 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1c060 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1c070 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
1c080 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
1c090 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20     sColname.z = 
1c0a0 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
1c0b0 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e        sColname.n
1c0c0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1c0d0 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  30(zColname);.  
1c0e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1c0f0 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
1c100 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
1c110 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
1c120 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1c130 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
1c140 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
1c150 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1c160 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
1c170 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
1c180 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
1c190 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1c1a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1c1b0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1c1c0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
1c1d0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1c1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1c1f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c200 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
1c210 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
1c220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c230 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c240 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1c250 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1c260 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
1c270 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
1c280 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
1c290 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
1c2a0 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
1c2b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
1c2c0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
1c2d0 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
1c2e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c2f0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
1c300 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
1c310 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
1c320 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1c330 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1c340 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
1c350 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
1c360 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
1c370 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1c380 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
1c390 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
1c3a0 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
1c3b0 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
1c3c0 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
1c3d0 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
1c3e0 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
1c3f0 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
1c400 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
1c410 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1c420 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
1c430 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
1c440 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
1c450 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
1c460 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
1c470 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
1c480 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
1c490 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
1c4a0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
1c4b0 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  t exprWalkNoop(W
1c4c0 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
1c4d0 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
1c4e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1c4f0 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
1c500 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
1c510 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1c520 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1c530 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
1c540 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1c550 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
1c560 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
1c570 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
1c580 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
1c590 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
1c5a0 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
1c5b0 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
1c5c0 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
1c5d0 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
1c5e0 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
1c5f0 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
1c600 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
1c610 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
1c620 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
1c630 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
1c640 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1c650 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
1c660 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
1c670 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
1c680 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
1c690 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
1c6a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
1c6b0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
1c6c0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
1c6d0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
1c6e0 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
1c6f0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1c700 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
1c710 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
1c720 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
1c730 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
1c740 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1c750 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
1c760 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1c770 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
1c780 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
1c790 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
1c7a0 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65  alker w;.  w.xSe
1c7b0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
1c7c0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
1c7d0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1c7e0 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
1c7f0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
1c800 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
1c810 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
1c820 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
1c830 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c840 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
1c850 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
1c860 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1c870 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
1c880 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
1c890 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
1c8a0 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
1c8b0 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
1c8c0 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
1c8d0 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
1c8e0 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
1c8f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
1c900 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
1c910 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
1c920 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
1c930 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
1c940 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
1c950 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1c960 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
1c970 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1c980 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
1c990 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
1c9a0 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
1c9b0 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1c9c0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
1c9d0 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
1c9e0 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
1c9f0 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
1ca00 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
1ca10 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
1ca20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
1ca30 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
1ca40 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
1ca50 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1ca60 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1ca70 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
1ca80 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1ca90 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
1caa0 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
1cab0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1cac0 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
1cad0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1cae0 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
1caf0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1cb00 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69  _Resolved );.  i
1cb10 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1cb20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
1cb30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73  )==0 ){.    p->s
1cb40 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
1cb50 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70  sTypeInfo;.    p
1cb60 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1cb70 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61  >pParse;.    pTa
1cb80 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1cb90 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  .    for(i=0, pF
1cba0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1cbb0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1cbc0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1cbd0 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
1cbe0 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1cbf0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  b;.      if( ALW
1cc00 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20  AYS(pTab!=0) && 
1cc10 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1cc20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
1cc30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1cc40 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
1cc50 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1cc60 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
1cc70 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
1cc80 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
1cc90 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61 73  lect;.        as
1cca0 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20  sert( pSel );.  
1ccb0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
1ccc0 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
1ccd0 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
1cce0 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41  .        selectA
1ccf0 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
1cd00 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
1cd10 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
1cd20 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a  b->aCol, pSel);.
1cd30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1cd40 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
1cd50 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69  ontinue;.}.#endi
1cd60 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
1cd70 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
1cd80 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1cd90 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
1cda0 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
1cdb0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1cdc0 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
1cdd0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
1cde0 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
1cdf0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
1ce00 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
1ce10 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
1ce20 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
1ce30 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1ce40 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
1ce50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ce60 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
1ce70 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1ce80 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1ce90 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
1cea0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
1ceb0 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1cec0 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e  ryTypeInfo;.  w.
1ced0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
1cee0 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
1cef0 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
1cf00 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
1cf10 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
1cf20 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
1cf30 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1cf40 6e 65 20 73 65 74 73 20 6f 66 20 61 20 53 45 4c  ne sets of a SEL
1cf50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
1cf60 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
1cf70 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
1cf80 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
1cf90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
1cfa0 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
1cfb0 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
1cfc0 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
1cfd0 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
1cfe0 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
1cff0 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
1d000 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
1d010 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1d020 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
1d030 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1d040 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
1d050 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
1d060 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
1d070 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
1d080 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
1d090 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
1d0a0 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
1d0b0 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
1d0c0 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
1d0d0 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
1d0e0 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
1d0f0 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
1d100 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
1d110 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1d120 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
1d130 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1d140 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
1d150 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1d160 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1d170 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1d180 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1d190 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
1d1a0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
1d1b0 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
1d1c0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
1d1d0 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
1d1e0 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
1d1f0 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ner */.){.  sqli
1d200 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e  te3 *db;.  if( N
1d210 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
1d220 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  urn;.  db = pPar
1d230 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d  se->db;.  if( p-
1d240 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
1d250 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
1d260 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
1d270 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73  lectExpand(pPars
1d280 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61  e, p);.  if( pPa
1d290 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1d2a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1d2b0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1d2c0 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
1d2d0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  mes(pParse, p, p
1d2e0 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20  OuterNC);.  if( 
1d2f0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1d300 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d310 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1d320 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
1d330 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29  eInfo(pParse, p)
1d340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
1d350 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
1d360 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
1d370 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
1d380 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61  accumulator is a
1d390 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63   set of memory c
1d3a0 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a  ells that hold.*
1d3b0 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
1d3c0 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c  esults while cal
1d3d0 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72  culating an aggr
1d3e0 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20  egate.  This.** 
1d3f0 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73  routine simply s
1d400 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
1d410 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
1d420 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ry cells..*/.sta
1d430 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63  tic void resetAc
1d440 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
1d450 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
1d460 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
1d470 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1d480 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1d490 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1d4a0 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  o_func *pFunc;. 
1d4b0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
1d4c0 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e  Func+pAggInfo->n
1d4d0 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20  Column==0 ){.   
1d4e0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
1d4f0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
1d500 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
1d510 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1d520 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1d530 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
1d540 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b  ->aCol[i].iMem);
1d550 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63  .  }.  for(pFunc
1d560 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1d570 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
1d580 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
1d590 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Func++){.    sql
1d5a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d5b0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46  , OP_Null, 0, pF
1d5c0 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20  unc->iMem);.    
1d5d0 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
1d5e0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
1d5f0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
1d600 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
1d610 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1d620 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
1d630 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1d640 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c      if( pE->x.pL
1d650 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e  ist==0 || pE->x.
1d660 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
1d670 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d680 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d690 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67  e, "DISTINCT agg
1d6a0 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76  regates must hav
1d6b0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a  e exactly one ".
1d6c0 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75             "argu
1d6d0 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  ment");.        
1d6e0 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
1d6f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1d700 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
1d710 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
1d720 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1d730 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
1d740 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
1d750 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d760 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
1d770 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
1d780 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
1d790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d7a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1d7b0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
1d7c0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
1d7d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d7e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
1d7f0 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
1d800 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
1d810 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
1d820 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
1d830 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
1d840 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
1d850 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
1d860 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
1d870 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1d880 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1d890 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1d8a0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1d8b0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1d8c0 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
1d8d0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
1d8e0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
1d8f0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1d900 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
1d910 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
1d920 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
1d930 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
1d940 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1d950 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
1d960 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1d970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d980 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op4(v, OP_AggFin
1d990 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
1d9a0 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
1d9b0 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20  pr : 0, 0,.     
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9d0 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
1d9e0 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
1d9f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
1da00 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
1da10 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
1da20 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
1da30 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
1da40 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
1da50 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
1da60 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
1da70 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
1da80 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
1da90 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1daa0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1dab0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1dac0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
1dad0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
1dae0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1daf0 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49  ol *pC;..  pAggI
1db00 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
1db10 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 1;.  sqlite3Ex
1db20 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
1db30 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rse);.  for(i=0,
1db40 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
1db50 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
1db60 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
1db70 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
1db80 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
1db90 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
1dba0 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72  regAgg;.    Expr
1dbb0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
1dbc0 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
1dbd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
1dbe0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1dbf0 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
1dc00 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69  Select) );.    i
1dc10 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1dc20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e    nArg = pList->
1dc30 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67  nExpr;.      reg
1dc40 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Agg = sqlite3Get
1dc50 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1dc60 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73  , nArg);.      s
1dc70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
1dc80 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1dc90 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 31 29  List, regAgg, 1)
1dca0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1dcb0 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20     nArg = 0;.   
1dcc0 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20     regAgg = 0;. 
1dcd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
1dce0 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
1dcf0 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
1dd00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1dd10 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1dd20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
1dd30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69   );.      codeDi
1dd40 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
1dd50 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64  F->iDistinct, ad
1dd60 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67  drNext, 1, regAg
1dd70 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  g);.    }.    if
1dd80 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61  ( pF->pFunc->fla
1dd90 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
1dda0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
1ddb0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1ddc0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
1ddd0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1dde0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
1ddf0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
1de00 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
1de10 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
1de20 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e   pF->pFunc has N
1de30 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20  EEDCOLL */.     
1de40 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
1de50 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
1de60 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
1de70 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1de80 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1de90 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1dea0 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
1deb0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
1dec0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
1ded0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
1dee0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
1def0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
1df00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1df10 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
1df20 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20  llSeq, 0, 0, 0, 
1df30 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
1df40 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1df50 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1df60 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
1df70 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67  gStep, 0, regAgg
1df80 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20  , pF->iMem,.    
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfa0 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
1dfb0 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
1dfc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1dfd0 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
1dfe0 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
1dff0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1e000 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1e010 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
1e020 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1e030 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
1e040 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
1e050 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  g);.    if( addr
1e060 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
1e070 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1e080 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
1e090 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1e0a0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
1e0b0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
1e0c0 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
1e0d0 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61  populating the a
1e0e0 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
1e0f0 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ters, clear the 
1e100 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
1e110 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1e120 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75   any of the requ
1e130 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ired column valu
1e140 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  es are already p
1e150 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20  resent .  ** in 
1e160 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74  registers, sqlit
1e170 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79  e3ExprCode() may
1e180 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f   use OP_SCopy to
1e190 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a   copy the value.
1e1a0 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d    ** to pC->iMem
1e1b0 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d  . But by the tim
1e1c0 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75  e the value is u
1e1d0 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  sed, the origina
1e1e0 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20  l register.  ** 
1e1f0 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73  may have been us
1e200 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67  ed, invalidating
1e210 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1e220 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74  buffer holding t
1e230 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20  he.  ** text or 
1e240 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20  blob value. See 
1e250 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63  ticket [883034dc
1e260 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  b5]..  **.  ** A
1e270 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20  nother solution 
1e280 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e  would be to chan
1e290 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20  ge the OP_SCopy 
1e2a0 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63  used to copy cac
1e2b0 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  hed.  ** values 
1e2c0 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20  to an OP_Copy.. 
1e2d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
1e2e0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
1e2f0 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  se);.  for(i=0, 
1e300 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
1e310 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
1e320 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
1e330 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
1e340 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1e350 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20  rse, pC->pExpr, 
1e360 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  pC->iMem);.  }. 
1e370 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
1e380 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c  tMode = 0;.  sql
1e390 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
1e3a0 61 72 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 2f  ar(pParse);.}../
1e3b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1e3c0 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
1e3d0 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
1e3e0 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
1e3f0 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
1e400 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
1e410 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
1e420 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
1e430 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e  ng on the.** con
1e440 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65 6c  tents of the Sel
1e450 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
1e460 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
1e470 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a  argument pDest.*
1e480 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  * as follows:.**
1e490 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e 65  .**     pDest->e
1e4a0 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a 2a  Dest    Result.*
1e4b0 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *     ----------
1e4c0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
1e4d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e4e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e4f0 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75 74  -.**     SRT_Out
1e500 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61 74  put      Generat
1e510 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  e a row of outpu
1e520 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  t (using the OP_
1e530 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20 20  ResultRow.**    
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e550 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61 63   opcode) for eac
1e560 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65 73  h row in the res
1e570 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20  ult set..**.**  
1e580 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20     SRT_Mem      
1e590 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66     Only valid if
1e5a0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
1e5b0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a   single column..
1e5c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e5d0 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65         Store the
1e5e0 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
1e5f0 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75 6c   the first resul
1e600 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  t row.**        
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
1e620 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e  register pDest->
1e630 69 50 61 72 6d 20 74 68 65 6e 20 61 62 61 6e 64  iParm then aband
1e640 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a 2a 20 20  on the rest.**  
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e660 20 20 20 6f 66 20 74 68 65 20 71 75 65 72 79 2e     of the query.
1e670 20 20 54 68 69 73 20 64 65 73 74 69 6e 61 74 69    This destinati
1e680 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c 49 4d 49  on implies "LIMI
1e690 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  T 1"..**.**     
1e6a0 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20  SRT_Set         
1e6b0 54 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20  The result must 
1e6c0 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  be a single colu
1e6d0 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61 63 68 0a  mn.  Store each.
1e6e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e6f0 20 20 20 20 20 20 20 72 6f 77 20 6f 66 20 72 65         row of re
1e700 73 75 6c 74 20 61 73 20 74 68 65 20 6b 65 79 20  sult as the key 
1e710 69 6e 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  in table pDest->
1e720 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20  iParm. .**      
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
1e740 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74  pply the affinit
1e750 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  y pDest->affinit
1e760 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67  y before storing
1e770 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1e780 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 73 2e          results.
1e790 20 20 55 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d    Used to implem
1e7a0 65 6e 74 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ent "IN (SELECT 
1e7b0 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ...)"..**.**    
1e7c0 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20   SRT_Union      
1e7d0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
1e7e0 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d  s a key in a tem
1e7f0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
1e800 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  st->iParm..**.**
1e810 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20       SRT_Except 
1e820 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75       Remove resu
1e830 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d  lts from the tem
1e840 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
1e850 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  st->iParm..**.**
1e860 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
1e870 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
1e880 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
1e890 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1e8a0 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rm..**          
1e8b0 20 20 20 20 20 20 20 20 20 20 20 54 68 69 73 20             This 
1e8c0 69 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68 65  is like SRT_Ephe
1e8d0 6d 54 61 62 20 65 78 63 65 70 74 20 74 68 61 74  mTab except that
1e8e0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20   the table.**   
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e900 20 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20    is assumed to 
1e910 61 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e 2e  already be open.
1e920 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
1e930 70 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74  phemTab    Creat
1e940 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  e an temporary t
1e950 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72  able pDest->iPar
1e960 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20  m and store.**  
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e980 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74 68     the result th
1e990 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72 20  ere. The cursor 
1e9a0 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66 74  is left open aft
1e9b0 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
1e9c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1e9d0 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 6c 69  ing.  This is li
1e9e0 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65 78 63  ke SRT_Table exc
1e9f0 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  ept that.**     
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea10 74 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e  this destination
1ea20 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70 68   uses OP_OpenEph
1ea30 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61 74 65  emeral to create
1ea40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ea50 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62 6c          the tabl
1ea60 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 20  e first..**.**  
1ea70 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65     SRT_Coroutine
1ea80 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f     Generate a co
1ea90 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72 65  -routine that re
1eaa0 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f 77 20  turns a new row 
1eab0 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
1eac0 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
1ead0 73 20 65 61 63 68 20 74 69 6d 65 20 69 74 20 69  s each time it i
1eae0 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65 20  s invoked.  The 
1eaf0 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20 20  entry point.**  
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75     of the co-rou
1eb20 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64 20 69  tine is stored i
1eb30 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73 74  n register pDest
1eb40 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ->iParm..**.**  
1eb50 20 20 20 53 52 54 5f 45 78 69 73 74 73 20 20 20     SRT_Exists   
1eb60 20 20 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20     Store a 1 in 
1eb70 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73  memory cell pDes
1eb80 74 2d 3e 69 50 61 72 6d 20 69 66 20 74 68 65 20  t->iParm if the 
1eb90 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  result.**       
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
1ebb0 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a  t is not empty..
1ebc0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69  **.**     SRT_Di
1ebd0 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77 20  scard     Throw 
1ebe0 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61 79  the results away
1ebf0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1ec00 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  by SELECT.**    
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68   statements with
1ec30 69 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f 73  in triggers whos
1ec40 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69  e only purpose i
1ec50 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
1ec60 20 20 20 20 20 20 20 20 20 74 68 65 20 73 69 64           the sid
1ec70 65 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75 6e  e-effects of fun
1ec80 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctions..**.** Th
1ec90 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1eca0 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
1ecb0 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
1ecc0 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
1ecd0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
1ece0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
1ecf0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
1ed00 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
1ed10 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
1ed20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ed30 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
1ed40 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
1ed50 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
1ed60 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
1ed70 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
1ed80 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
1ed90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
1eda0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1edb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1edc0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1edd0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1ede0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1edf0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1ee00 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
1ee10 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
1ee20 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
1ee30 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
1ee40 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
1ee50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
1ee60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ee70 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
1ee80 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
1ee90 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
1eea0 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
1eeb0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
1eec0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
1eed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1eee0 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
1eef0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
1ef00 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
1ef10 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
1ef20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
1ef30 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
1ef40 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
1ef50 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1ef60 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1ef70 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
1ef80 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
1ef90 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
1efa0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1efb0 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
1efc0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
1efd0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
1efe0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1eff0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1f000 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1f010 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
1f020 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1f030 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
1f040 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1f050 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
1f060 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
1f070 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
1f080 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
1f090 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
1f0a0 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
1f0b0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
1f0c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
1f0d0 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
1f0e0 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
1f0f0 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
1f100 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
1f110 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20   distinct;      
1f120 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1f130 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
1f140 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  inct set */.  in
1f150 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
1f160 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
1f170 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
1f180 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
1f190 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
1f1a0 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  x;     /* Addres
1f1b0 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45  s of an OP_OpenE
1f1c0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
1f1d0 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66  tion */.  AggInf
1f1e0 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
1f1f0 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
1f200 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
1f210 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
1f220 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
1f230 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1f240 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
1f250 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
1f260 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
1f270 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1f280 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1f290 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  */..  db = pPars
1f2a0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d  e->db;.  if( p==
1f2b0 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
1f2c0 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
1f2d0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
1f2e0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
1f2f0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1f300 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1f310 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
1f320 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
1f330 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
1f340 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
1f350 49 6e 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49  Info));..  if( I
1f360 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
1f370 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73  pDest) ){.    as
1f380 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
1f390 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
1f3a0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1f3b0 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
1f3c0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
1f3d0 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
1f3e0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
1f3f0 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a  ==SRT_Discard);.
1f400 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20      /* If ORDER 
1f410 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66  BY makes no diff
1f420 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75  erence in the ou
1f430 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65  tput then neithe
1f440 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49  r does.    ** DI
1f450 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e  STINCT so it can
1f460 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e   be removed too.
1f470 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
1f480 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1f490 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
1f4a0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1f4b0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  = 0;.    p->selF
1f4c0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
1f4d0 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
1f4e0 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
1f4f0 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70  arse, p, 0);.  p
1f500 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1f510 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
1f520 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
1f530 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
1f540 74 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  t;.  if( pParse-
1f550 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
1f560 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1f570 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1f580 3b 0a 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20  ;.  }.  isAgg = 
1f590 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f5a0 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
1f5b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
1f5c0 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  t!=0 );..  /* Be
1f5d0 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
1f5e0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
1f5f0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1f600 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
1f610 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1f620 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  _end;..  /* If w
1f630 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
1f640 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
1f650 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
1f660 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
1f670 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
1f680 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1f690 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1f6a0 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
1f6b0 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
1f6c0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
1f6d0 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st, pEList->nExp
1f6e0 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  r) ){.    goto s
1f6f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
1f700 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
1f710 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
1f720 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
1f730 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f740 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
1f750 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1f760 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1f770 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f780 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
1f790 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20  ; !p->pPrior && 
1f7a0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1f7b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
1f7c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1f7d0 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
1f7e0 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
1f7f0 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
1f800 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
1f810 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
1f820 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53  ;.    int isAggS
1f830 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75  ub;..    if( pSu
1f840 62 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69  b==0 || pItem->i
1f850 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e  sPopulated ) con
1f860 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49  tinue;..    /* I
1f870 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
1f880 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
1f890 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
1f8a0 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
1f8b0 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
1f8c0 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
1f8d0 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
1f8e0 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
1f8f0 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
1f900 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
1f910 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
1f920 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
1f930 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
1f940 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
1f950 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
1f960 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
1f970 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
1f980 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
1f990 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
1f9a0 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
1f9b0 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
1f9c0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
1f9d0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
1f9e0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
1f9f0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20  xprHeight(p);.. 
1fa00 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
1fa10 65 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ee if the subque
1fa20 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62  ry can be absorb
1fa30 65 64 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ed into the pare
1fa40 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 73 41 67 67  nt. */.    isAgg
1fa50 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c  Sub = (pSub->sel
1fa60 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
1fa70 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66  gate)!=0;.    if
1fa80 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  ( flattenSubquer
1fa90 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20  y(pParse, p, i, 
1faa0 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29  isAgg, isAggSub)
1fab0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
1fac0 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
1fad0 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
1fae0 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
1faf0 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
1fb00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fb10 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  i = -1;.    }els
1fb20 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1fb30 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
1fb40 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54  dest, SRT_EphemT
1fb50 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  ab, pItem->iCurs
1fb60 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  or);.      asser
1fb70 74 28 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75  t( pItem->isPopu
1fb80 6c 61 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  lated==0 );.    
1fb90 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
1fba0 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
1fbb0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
1fbc0 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d  m->isPopulated =
1fbd0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1fbe0 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72  ( /*pParse->nErr
1fbf0 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63   ||*/ db->malloc
1fc00 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
1fc10 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1fc20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
1fc30 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
1fc40 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
1fc50 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54  eight(p);.    pT
1fc60 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1fc70 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
1fc80 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
1fc90 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  t) ){.      pOrd
1fca0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1fcb0 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  By;.    }.  }.  
1fcc0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
1fcd0 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68  st;.#endif.  pWh
1fce0 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
1fcf0 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
1fd00 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
1fd10 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
1fd20 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20  g;.  isDistinct 
1fd30 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
1fd40 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1fd50 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1fd60 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
1fd70 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
1fd80 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
1fd90 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
1fda0 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
1fdb0 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
1fdc0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1fdd0 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  or ){.    if( p-
1fde0 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29  >pRightmost==0 )
1fdf0 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
1fe00 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d  pLoop, *pRight =
1fe10 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   0;.      int cn
1fe20 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
1fe30 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20 20 20   mxSelect;.     
1fe40 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
1fe50 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
1fe60 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29  ->pPrior, cnt++)
1fe70 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
1fe80 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b  >pRightmost = p;
1fe90 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
1fea0 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a  pNext = pRight;.
1feb0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
1fec0 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a   pLoop;.      }.
1fed0 20 20 20 20 20 20 6d 78 53 65 6c 65 63 74 20 3d        mxSelect =
1fee0 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
1fef0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
1ff00 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20  D_SELECT];.     
1ff10 20 69 66 28 20 6d 78 53 65 6c 65 63 74 20 26 26   if( mxSelect &&
1ff20 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b   cnt>mxSelect ){
1ff30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ff40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ff50 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73   "too many terms
1ff60 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c   in compound SEL
1ff70 45 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ECT");.        r
1ff80 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
1ff90 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1ffa0 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  n multiSelect(pP
1ffb0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
1ffc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1ffd0 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72  * If possible, r
1ffe0 65 77 72 69 74 65 20 74 68 65 20 71 75 65 72 79  ewrite the query
1fff0 20 74 6f 20 75 73 65 20 47 52 4f 55 50 20 42 59   to use GROUP BY
20000 20 69 6e 73 74 65 61 64 20 6f 66 20 44 49 53 54   instead of DIST
20010 49 4e 43 54 2e 0a 20 20 2a 2a 20 47 52 4f 55 50  INCT..  ** GROUP
20020 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 6e   BY might use an
20030 20 69 6e 64 65 78 2c 20 44 49 53 54 49 4e 43 54   index, DISTINCT
20040 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a 20 20 2a   never does..  *
20050 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
20060 47 72 6f 75 70 42 79 3d 3d 30 20 7c 7c 20 28 70  GroupBy==0 || (p
20070 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
20080 41 67 67 72 65 67 61 74 65 29 21 3d 30 20 29 3b  Aggregate)!=0 );
20090 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
200a0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
200b0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
200c0 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
200d0 7b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  {.    p->pGroupB
200e0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
200f0 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
20100 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47  List, 0);.    pG
20110 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
20120 75 70 42 79 3b 0a 20 20 20 20 70 2d 3e 73 65 6c  upBy;.    p->sel
20130 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
20140 74 69 6e 63 74 3b 0a 20 20 20 20 69 73 44 69 73  tinct;.    isDis
20150 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  tinct = 0;.  }..
20160 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
20170 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59   both a GROUP BY
20180 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59   and an ORDER BY
20190 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79   clause and they
201a0 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e 74 69   are.  ** identi
201b0 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61 62 6c  cal, then disabl
201c0 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
201d0 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68 65 20  lause since the 
201e0 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20 77 69  GROUP BY.  ** wi
201f0 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
20200 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 69 6e  s to come out in
20210 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
20220 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a  er.  This is.  *
20230 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * an optimizatio
20240 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20  n - the correct 
20250 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65  answer should re
20260 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e  sult regardless.
20270 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51  .  ** Use the SQ
20280 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
20290 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
202a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
202b0 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20 64 69  MIZER.  ** to di
202c0 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d  sable this optim
202d0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74  ization for test
202e0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 20 20  ing purposes..  
202f0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
20300 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
20310 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 4f 72  p->pGroupBy, pOr
20320 64 65 72 42 79 29 3d 3d 30 0a 20 20 20 20 20 20  derBy)==0.      
20330 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73     && (db->flags
20340 20 26 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42   & SQLITE_GroupB
20350 79 4f 72 64 65 72 29 3d 3d 30 20 29 7b 0a 20 20  yOrder)==0 ){.  
20360 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
20370 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
20380 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
20390 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
203a0 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
203b0 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
203c0 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
203d0 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
203e0 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
203f0 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
20400 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
20410 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
20420 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
20430 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
20440 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
20450 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
20460 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
20470 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
20480 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
20490 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
204a0 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
204b0 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
204c0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
204d0 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
204e0 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
204f0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
20500 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
20510 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
20520 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
20530 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
20540 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  e, pOrderBy);.  
20550 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
20560 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
20570 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64  Tab++;.    p->ad
20580 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
20590 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
205a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
205b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
205c0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205e0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
205f0 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
20600 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
20610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
20630 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
20640 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
20650 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20660 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
20670 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
20680 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
20690 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
206a0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
206b0 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
206c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
206d0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
206e0 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
206f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20700 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
20710 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  al, pDest->iParm
20720 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
20730 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
20740 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
20750 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
20760 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
20770 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
20780 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
20790 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20  se, p, iEnd);.. 
207a0 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75   /* Open a virtu
207b0 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
207c0 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
207d0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
207e0 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20   isDistinct ){. 
207f0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
20800 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  Info;.    assert
20810 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75  ( isAgg || pGrou
20820 70 42 79 20 29 3b 0a 20 20 20 20 64 69 73 74 69  pBy );.    disti
20830 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
20840 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ab++;.    pKeyIn
20850 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
20860 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
20870 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
20880 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20890 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
208a0 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74  emeral, distinct
208b0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
208c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208d0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
208e0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
208f0 4f 46 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OFF);.    sqlite
20900 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
20910 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
20920 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20930 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  distinct = -1;. 
20940 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61   }..  /* Aggrega
20950 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65  te and non-aggre
20960 67 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65  gate queries are
20970 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
20980 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69  ntly */.  if( !i
20990 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
209a0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
209b0 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e  is case is for n
209c0 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
209d0 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69  ries.    ** Begi
209e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
209f0 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  can.    */.    p
20a00 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
20a10 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
20a20 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
20a30 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c 20 30  re, &pOrderBy, 0
20a40 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
20a50 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
20a60 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
20a70 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
20a80 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
20a90 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
20aa0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
20ab0 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
20ac0 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
20ad0 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
20ae0 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
20af0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
20b00 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
20b10 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
20b20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64   if( addrSortInd
20b30 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42  ex>=0 && pOrderB
20b40 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
20b50 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
20b60 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72  oNoop(v, addrSor
20b70 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20  tIndex, 1);.    
20b80 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
20b90 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  m[2] = -1;.    }
20ba0 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
20bb0 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
20bc0 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20  loop.    */.    
20bd0 61 73 73 65 72 74 28 21 69 73 44 69 73 74 69 6e  assert(!isDistin
20be0 63 74 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49  ct);.    selectI
20bf0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
20c00 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
20c10 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  , pOrderBy, -1, 
20c20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
20c30 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
20c40 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57  o->iContinue, pW
20c50 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a  Info->iBreak);..
20c60 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
20c70 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
20c80 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
20c90 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
20ca0 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
20cb0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
20cc0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  he processing fo
20cd0 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  r aggregate quer
20ce0 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ies */.    NameC
20cf0 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
20d00 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
20d10 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
20d20 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
20d30 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
20d40 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
20d50 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
20d60 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
20d70 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
20d80 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
20d90 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
20da0 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
20db0 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
20dc0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
20dd0 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
20de0 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
20df0 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
20e00 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
20e10 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
20e30 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
20e40 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
20e50 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
20e60 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
20e70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
20e80 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
20e90 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
20ea0 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
20eb0 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
20ec0 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
20ed0 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
20ee0 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
20ef0 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
20f00 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
20f10 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20  UP BY order */. 
20f20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
20f30 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
20f40 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
20f50 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 0a  this SELECT */..
20f60 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
20f70 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
20f80 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
20f90 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
20fa0 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
20fb0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
20fc0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
20fd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ff0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
21000 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
21010 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
21020 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
21030 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
21040 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
21050 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
21060 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
21070 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
21080 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
21090 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
210a0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
210b0 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  >iAlias = 0;.   
210c0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b     }.      for(k
210d0 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
210e0 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
210f0 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
21100 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
21110 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d   pItem->iAlias =
21120 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
21130 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.. .    /* Crea
21140 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
21150 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
21160 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
21170 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
21180 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
21190 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
211a0 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
211b0 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
211c0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
211d0 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
211e0 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
211f0 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
21200 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
21210 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
21220 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
21230 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
21240 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
21250 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
21260 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
21270 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
21280 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
21290 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
212a0 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
212b0 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
212c0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
212d0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
212e0 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
212f0 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b  By->nExpr+1 : 0;
21300 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
21310 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
21320 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  y;.    sqlite3Ex
21330 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
21340 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a  (&sNC, pEList);.
21350 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
21360 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
21370 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  NC, pOrderBy);. 
21380 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
21390 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
213a0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
213b0 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69  ates(&sNC, pHavi
213c0 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ng);.    }.    s
213d0 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
213e0 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
213f0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72  nColumn;.    for
21400 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
21410 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  .nFunc; i++){.  
21420 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
21430 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67  rHasProperty(sAg
21440 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
21450 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
21460 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ct) );.      sql
21470 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
21480 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
21490 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
214a0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
214b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
214c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
214d0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
214e0 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
214f0 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
21500 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
21510 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
21520 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
21530 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
21540 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
21550 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
21560 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
21570 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
21580 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
21590 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
215a0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
215b0 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
215c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
215d0 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20   int j1;        
215e0 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
215f0 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
21600 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
21610 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
21620 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
21630 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
21640 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
21650 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
21660 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
21670 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
21680 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
21690 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
216a0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
216b0 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
216c0 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
216d0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
216e0 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
216f0 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
21700 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
21710 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
21720 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
21730 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
21740 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
21750 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
21760 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
21770 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
21780 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
21790 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
217a0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
217b0 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
217c0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
217d0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
217e0 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
217f0 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
21800 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
21810 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
21820 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
21830 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
21840 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
21850 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
21860 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
21870 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
21880 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
21890 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
218a0 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
218b0 2c 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65  , the OpenEpheme
218c0 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ral instruction.
218d0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
218e0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
218f0 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
21900 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
21910 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
21920 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
21930 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
21940 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
21950 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
21960 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64  upBy);.      add
21970 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71  rSortingIdx = sq
21980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21990 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
219a0 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ral, .          
219b0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
219c0 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53  Idx, sAggInfo.nS
219d0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20  ortingColumn, . 
219e0 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61           0, (cha
219f0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
21a00 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
21a10 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
21a20 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
21a30 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
21a40 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
21a50 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
21a60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
21a70 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
21a80 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
21a90 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
21aa0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
21ab0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
21ac0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
21ad0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
21ae0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
21af0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
21b00 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
21b10 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
21b20 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
21b30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
21b40 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
21b50 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
21b60 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
21b70 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
21b80 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
21b90 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
21ba0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
21bb0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
21bc0 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
21bd0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
21be0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21bf0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
21c00 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
21c10 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
21c20 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
21c30 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
21c40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21c50 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
21c60 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
21c70 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
21c80 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
21c90 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
21ca0 74 79 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ty"));..      /*
21cb0 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68   Begin a loop th
21cc0 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
21cd0 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20  all source rows 
21ce0 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
21cf0 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  r..      ** This
21d00 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74   might involve t
21d10 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70  wo separate loop
21d20 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72  s with an OP_Sor
21d30 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72  t in between, or
21d40 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67  .      ** it mig
21d50 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c  ht be a single l
21d60 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e  oop that uses an
21d70 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63   index to extrac
21d80 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20  t information.  
21d90 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69      ** in the ri
21da0 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67  ght order to beg
21db0 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a  in with..      *
21dc0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
21dd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21de0 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
21df0 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
21e00 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
21e10 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
21e20 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
21e30 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42  pWhere, &pGroupB
21e40 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  y, 0);.      if(
21e50 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
21e60 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
21e70 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
21e80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
21e90 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
21ea0 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
21eb0 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
21ec0 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
21ed0 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
21ee0 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
21ef0 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
21f00 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
21f10 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
21f20 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
21f30 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
21f40 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
21f50 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
21f60 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f   */.        pGro
21f70 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
21f80 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75  By;.        grou
21f90 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
21fa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21fb0 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
21fc0 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
21fd0 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
21fe0 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
21ff0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
22000 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
22010 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
22020 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
22030 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
22040 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
22050 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
22060 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
22070 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
22080 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
22090 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
220a0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  /.        int re
220b0 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69  gBase;.        i
220c0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20  nt regRecord;.  
220d0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a        int nCol;.
220e0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f          int nGro
220f0 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 67  upBy;..        g
22100 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
22110 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
22120 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
22130 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
22140 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b   = nGroupBy + 1;
22150 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
22160 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
22170 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
22180 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
22190 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
221a0 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
221b0 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
221c0 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
221d0 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
221e0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
221f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22200 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
22210 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
22220 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
22230 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
22240 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
22250 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
22260 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22270 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
22280 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
22290 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20  regBase, 0);.   
222a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
222b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
222c0 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e  uence, sAggInfo.
222d0 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61  sortingIdx,regBa
222e0 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20  se+nGroupBy);.  
222f0 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
22300 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  By+1;.        fo
22310 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
22320 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
22330 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
22340 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
22350 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
22360 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
22370 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
22380 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
22390 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
223a0 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73   r1 = j + regBas
223b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
223c0 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20  nt r2;..        
223d0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
223e0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
223f0 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  n(pParse, .     
22400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22410 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
22420 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
22430 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
22440 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
22450 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
22460 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22480 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
22490 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
224a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
224b0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
224c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
224d0 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
224e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
224f0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
22500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22510 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
22520 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
22530 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
22540 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22550 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22560 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41  OP_IdxInsert, sA
22570 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
22580 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
22590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
225a0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
225b0 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
225c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
225d0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
225e0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
225f0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
22600 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
22610 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
22620 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22630 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
22640 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
22650 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
22660 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
22670 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
22680 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20   sort"));.      
22690 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
226a0 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
226b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
226c0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
226d0 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  se);.      }..  
226e0 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
226f0 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
22700 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
22710 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
22720 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
22730 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
22740 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
22750 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
22760 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
22770 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
22780 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
22790 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
227a0 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
227b0 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
227c0 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
227d0 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
227e0 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
227f0 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
22800 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
22810 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
22820 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
22830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22840 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
22850 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 66 6f  Parse);.      fo
22860 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
22870 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
22880 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
22890 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
228a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
228b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
228c0 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  umn, sAggInfo.so
228d0 72 74 69 6e 67 49 64 78 2c 20 6a 2c 20 69 42 4d  rtingIdx, j, iBM
228e0 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
228f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22900 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
22910 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
22920 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
22930 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
22940 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  pBy->a[j].pExpr,
22950 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
22960 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22970 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22980 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
22990 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d  re, iAMem, iBMem
229a0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
229b0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
229d0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
229e0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
229f0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
22a00 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
22a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22a20 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
22a30 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31  ump, j1+1, 0, j1
22a40 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  +1);..      /* G
22a50 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
22a60 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20  t runs whenever 
22a70 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61  the GROUP BY cha
22a80 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43  nges..      ** C
22a90 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52  hanges in the GR
22aa0 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63  OUP BY are detec
22ab0 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
22ac0 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a  ous code.      *
22ad0 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65  * block.  If the
22ae0 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67  re were no chang
22af0 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69  es, this block i
22b00 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20  s skipped..     
22b10 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
22b20 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75  s code copies cu
22b30 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74  rrent group by t
22b40 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32  erms in b0,b1,b2
22b50 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76  ,....      ** ov
22b60 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20  er to a0,a1,a2. 
22b70 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74   It then calls t
22b80 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
22b90 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tine.      ** an
22ba0 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67  d resets the agg
22bb0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
22bc0 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  or registers in 
22bd0 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20  preparation.    
22be0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78    ** for the nex
22bf0 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68  t GROUP BY batch
22c00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
22c10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22c20 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d  Move(pParse, iBM
22c30 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75  em, iAMem, pGrou
22c40 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  pBy->nExpr);.   
22c50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22c60 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
22c70 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
22c80 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
22c90 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22ca0 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e  t((v, "output on
22cb0 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
22cc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22cd0 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
22ce0 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45  AbortFlag, addrE
22cf0 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  nd);.      VdbeC
22d00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
22d10 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
22d20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22d30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
22d40 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
22d50 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
22d60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22d70 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
22d80 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
22d90 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
22da0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
22db0 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
22dc0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
22dd0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
22de0 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
22df0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22e00 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
22e10 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
22e20 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
22e30 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
22e40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22e50 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
22e60 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  er, 1, iUseFlag)
22e70 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
22e80 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
22e90 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
22ea0 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
22eb0 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
22ec0 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
22ed0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
22ee0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
22ef0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22f00 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67  v, OP_Next, sAgg
22f10 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
22f20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b   addrTopOfLoop);
22f30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
22f50 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
22f60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22f70 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
22f80 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
22f90 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
22fa0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
22fb0 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
22fc0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
22fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22fe0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
22ff0 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
23000 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
23010 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
23020 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
23030 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a   final row"));..
23040 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76        /* Jump ov
23050 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  er the subroutin
23060 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  es.      */.    
23070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23080 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
23090 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  0, addrEnd);..  
230a0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
230b0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
230c0 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
230d0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
230e0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
230f0 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
23100 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
23110 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
23120 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
23130 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
23140 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
23150 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
23160 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
23170 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
23180 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
23190 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
231a0 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
231b0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
231c0 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
231d0 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
231e0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
231f0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
23200 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
23210 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
23220 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
23230 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
23240 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
23250 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
23260 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
23270 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23280 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
23290 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
232a0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
232b0 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
232c0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
232d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
232e0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
232f0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
23300 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23310 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23320 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
23330 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
23340 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
23350 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
23360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23370 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
23380 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
23390 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
233a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
233b0 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79  ent((v, "Groupby
233c0 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
233d0 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
233e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
233f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
23400 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
23410 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e  tRow);.      fin
23420 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
23430 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
23440 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
23450 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
23460 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
23470 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
23480 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
23490 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
234a0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
234b0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
234c0 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
234d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
234e0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c         distinct,
234f0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
23500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
23510 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
23520 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
23530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23540 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
23550 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
23560 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
23570 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
23580 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
23590 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
235a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
235b0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
235c0 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
235d0 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
235e0 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
235f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
23600 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
23610 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
23620 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
23630 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
23640 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
23650 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
23660 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
23670 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
23680 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
23690 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
236a0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
236b0 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
236c0 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
236d0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
236e0 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
236f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
23700 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
23710 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
23720 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
23730 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
23740 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
23750 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
23760 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
23770 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
23780 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
23790 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
237a0 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
237b0 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
237c0 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
237d0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
237e0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
237f0 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
23800 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
23810 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
23820 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
23830 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
23840 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
23850 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
23860 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
23870 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
23880 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
23890 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
238a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
238b0 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
238c0 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
238d0 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
238e0 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
238f0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
23900 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
23910 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
23920 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
23930 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
23940 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
23950 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
23960 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
23970 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
23980 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
23990 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
239a0 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
239b0 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
239c0 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
239d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
239e0 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
239f0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
23a00 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
23a10 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
23a20 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
23a30 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
23a40 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
23a50 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
23a60 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
23a70 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
23aa0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
23ab0 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
23ac0 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
23ae0 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
23af0 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
23b00 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
23b10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23b20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
23b30 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
23b40 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
23b50 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
23b60 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
23b70 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
23b80 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
23b90 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
23ba0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
23bb0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
23bc0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
23bd0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
23be0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
23bf0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
23c00 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
23c10 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
23c20 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
23c30 73 20 74 68 65 20 6c 65 61 73 74 20 61 6d 6f 75  s the least amou
23c40 6e 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20 49  nt of columns. I
23c50 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
23c60 72 65 20 69 73 20 73 75 63 68 20 61 6e 20 69 6e  re is such an in
23c70 64 65 78 2c 20 61 6e 64 20 69 74 20 68 61 73 20  dex, and it has 
23c80 6c 65 73 73 20 63 6f 6c 75 6d 6e 73 20 74 68 61  less columns tha
23c90 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  n the table.    
23ca0 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20 74 68 65      ** does, the
23cb0 6e 20 77 65 20 63 61 6e 20 61 73 73 75 6d 65 20  n we can assume 
23cc0 74 68 61 74 20 69 74 20 63 6f 6e 73 75 6d 65 73  that it consumes
23cd0 20 6c 65 73 73 20 73 70 61 63 65 20 6f 6e 20 64   less space on d
23ce0 69 73 6b 20 61 6e 64 0a 20 20 20 20 20 20 20 20  isk and.        
23cf0 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72  ** will therefor
23d00 65 20 62 65 20 63 68 65 61 70 65 72 20 74 6f 20  e be cheaper to 
23d10 73 63 61 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e  scan to determin
23d20 65 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  e the query resu
23d30 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  lt..        ** I
23d40 6e 20 74 68 69 73 20 63 61 73 65 20 73 65 74 20  n this case set 
23d50 69 52 6f 6f 74 20 74 6f 20 74 68 65 20 72 6f 6f  iRoot to the roo
23d60 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
23d70 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65   the index b-tre
23d80 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  e.        ** and
23d90 20 70 4b 65 79 49 6e 66 6f 20 74 6f 20 74 68 65   pKeyInfo to the
23da0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
23db0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 6e  re required to n
23dc0 61 76 69 67 61 74 65 20 74 68 65 0a 20 20 20 20  avigate the.    
23dd0 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20      ** index..  
23de0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
23df0 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
23e00 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
23e10 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
23e20 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
23e30 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
23e40 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
23e50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
23e60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
23e70 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
23e80 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
23e90 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
23ea0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
23eb0 28 20 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78  ( !pBest || pIdx
23ec0 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d  ->nColumn<pBest-
23ed0 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
23ee0 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
23ef0 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
23f00 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
23f10 20 20 20 20 69 66 28 20 70 42 65 73 74 20 26 26      if( pBest &&
23f20 20 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c   pBest->nColumn<
23f30 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
23f40 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20          iRoot = 
23f50 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20  pBest->tnum;.   
23f60 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20         pKeyInfo 
23f70 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
23f80 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 42  yinfo(pParse, pB
23f90 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  est);.        }.
23fa0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
23fb0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
23fc0 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65  sor, execute the
23fd0 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65   OP_Count, close
23fe0 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a   the cursor. */.
23ff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24000 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
24010 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
24020 69 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  iRoot, iDb);.   
24030 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
24040 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  o ){.          s
24050 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
24060 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
24070 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
24080 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
24090 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
240a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
240b0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
240c0 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f  , iCsr, sAggInfo
240d0 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b  .aFunc[0].iMem);
240e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
240f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
24100 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20  _Close, iCsr);. 
24110 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
24120 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
24130 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20  _BTREECOUNT */. 
24140 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
24150 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71  * Check if the q
24160 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f  uery is of one o
24170 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
24180 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a  forms:.        *
24190 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
241a0 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f  ELECT min(x) FRO
241b0 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
241c0 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29     SELECT max(x)
241d0 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
241e0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
241f0 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61  If it is, then a
24200 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77  sk the code in w
24210 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70  here.c to attemp
24220 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74  t to sort result
24230 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20  s.        ** as 
24240 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  if there was an 
24250 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20  "ORDER ON x" or 
24260 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43  "ORDER ON x DESC
24270 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20  " clause. .     
24280 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63     ** If where.c
24290 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64   is able to prod
242a0 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74  uce results sort
242b0 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72  ed in this order
242c0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
242d0 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20  * add vdbe code 
242e0 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
242f0 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  the processing l
24300 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20  oop after the . 
24310 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
24320 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65  iteration (since
24330 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
24340 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
24350 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
24360 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70  guaranteed to op
24370 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77  erate on the row
24380 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75   with the minimu
24390 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20  m or maximum .  
243a0 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
243b0 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f  f x, the only ro
243c0 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20  w required)..   
243d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
243e0 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61  ** A special fla
243f0 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  g must be passed
24400 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
24410 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68  Begin() to sligh
24420 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  tly.        ** m
24430 6f 64 69 66 79 20 62 65 68 61 76 69 6f 75 72 20  odify behaviour 
24440 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
24450 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
24460 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
24470 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
24480 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
24490 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
244a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77          **     w
244b0 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
244c0 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
244d0 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
244e0 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
244f0 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
24500 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
24510 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
24520 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
24530 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
24540 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
24550 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  s which.        
24560 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
24570 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
24580 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
24590 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
245a0 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  y on .        **
245b0 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
245c0 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
245d0 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
245e0 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
245f0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  s..        **   
24600 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
24610 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
24620 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
24630 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ils..        */.
24640 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
24650 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
24660 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d         u8 flag =
24670 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70 29 3b   minMaxQuery(p);
24680 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
24690 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  g ){.          a
246a0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
246b0 72 6f 70 65 72 74 79 28 70 2d 3e 70 45 4c 69 73  roperty(p->pELis
246c0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 45  t->a[0].pExpr, E
246d0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
246e0 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
246f0 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  x = sqlite3ExprL
24700 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
24710 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
24720 2d 3e 78 2e 70 4c 69 73 74 2c 30 29 3b 0a 20 20  ->x.pList,0);.  
24730 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70          pDel = p
24740 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20  MinMax;.        
24750 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26    if( pMinMax &&
24760 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
24770 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
24780 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
24790 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
247a0 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
247b0 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20  MIN ?1:0;.      
247c0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
247d0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
247e0 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
247f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
24800 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  .  .        /* T
24810 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
24820 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
24830 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
24840 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
24850 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
24860 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
24870 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
24880 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
24890 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ow.        ** of
248a0 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20   output..       
248b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
248c0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
248d0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
248e0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20  .        pWInfo 
248f0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
24900 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
24910 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
24920 4d 69 6e 4d 61 78 2c 20 66 6c 61 67 29 3b 0a 20  MinMax, flag);. 
24930 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66         if( pWInf
24940 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
24950 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
24960 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
24970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
24980 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
24990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
249a0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
249b0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
249c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
249d0 28 20 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c  ( !pMinMax && fl
249e0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
249f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24a00 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
24a10 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
24a20 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
24a30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28  Comment((v, "%s(
24a40 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20  ) by index",.   
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
24a60 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
24a70 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
24a80 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ")));.        }.
24a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
24aa0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
24ab0 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  .        finaliz
24ac0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
24ad0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
24ae0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
24af0 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
24b00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24b10 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
24b20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
24b30 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
24b40 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
24b50 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
24b60 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
24b70 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a  , 0, 0, 0, -1, .
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
24ba0 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
24bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24bc0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
24bd0 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
24be0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
24bf0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
24c00 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
24c10 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
24c20 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a  e query */..  /*
24c30 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
24c40 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
24c50 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
24c60 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
24c70 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
24c80 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
24c90 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
24ca0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
24cb0 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65  erBy ){.    gene
24cc0 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
24cd0 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
24ce0 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29  t->nExpr, pDest)
24cf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
24d00 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
24d10 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
24d20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
24d30 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
24d40 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
24d50 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
24d60 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
24d70 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
24d80 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
24d90 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
24da0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
24db0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
24dc0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
24dd0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
24de0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
24df0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
24e00 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
24e10 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
24e20 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20  /.select_end:.. 
24e30 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
24e40 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73  umn names if res
24e50 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ults of the SELE
24e60 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74  CT are to be out
24e70 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  put..  */.  if( 
24e80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24e90 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
24ea0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
24eb0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
24ec0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
24ed0 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
24ee0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62    }..  sqlite3Db
24ef0 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
24f00 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
24f10 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
24f20 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20  gInfo.aFunc);.  
24f30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
24f40 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
24f50 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a  _DEBUG)./*.*****
24f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
24fb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
24fc0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
24fd0 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
24fe0 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f  ng only.  The co
24ff0 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f  de.** that follo
25000 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  ws does not appe
25010 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69  ar in normal bui
25020 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  lds..**.** These
25030 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
25040 65 64 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ed to print out 
25050 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
25060 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66 20 61 20  ll or part of a 
25070 0a 2a 2a 20 70 61 72 73 65 20 73 74 72 75 63 74  .** parse struct
25080 75 72 65 73 20 73 75 63 68 20 61 73 20 53 65 6c  ures such as Sel
25090 65 63 74 20 6f 72 20 45 78 70 72 2e 20 20 53 75  ect or Expr.  Su
250a0 63 68 20 70 72 69 6e 74 6f 75 74 73 20 61 72 65  ch printouts are
250b0 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68   useful.** for h
250c0 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64 65 72 73  elping to unders
250d0 74 61 6e 64 20 77 68 61 74 20 69 73 20 68 61 70  tand what is hap
250e0 70 65 6e 69 6e 67 20 69 6e 73 69 64 65 20 74 68  pening inside th
250f0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
25100 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 65  .** during the e
25110 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70  xecution of comp
25120 6c 65 78 20 53 45 4c 45 43 54 20 73 74 61 74 65  lex SELECT state
25130 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
25140 73 65 20 72 6f 75 74 69 6e 65 20 61 72 65 20 6e  se routine are n
25150 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79 77 68 65  ot called anywhe
25160 72 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  re from within t
25170 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64  he normal.** cod
25180 65 20 62 61 73 65 2e 20 20 54 68 65 6e 20 61 72  e base.  Then ar
25190 65 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  e intended to be
251a0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
251b0 68 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72  hin the debugger
251c0 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70  .** or from temp
251d0 6f 72 61 72 79 20 22 70 72 69 6e 74 66 22 20 73  orary "printf" s
251e0 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 65 72 74  tatements insert
251f0 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
25200 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25210 33 50 72 69 6e 74 45 78 70 72 28 45 78 70 72 20  3PrintExpr(Expr 
25220 2a 70 29 7b 0a 20 20 69 66 28 20 21 45 78 70 72  *p){.  if( !Expr
25230 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
25240 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
25250 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
25260 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25270 69 6e 74 66 28 22 28 25 73 22 2c 20 70 2d 3e 75  intf("(%s", p->u
25280 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d 65 6c 73  .zToken);.  }els
25290 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
252a0 62 75 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c  bugPrintf("(%d",
252b0 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69   p->op);.  }.  i
252c0 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  f( p->pLeft ){. 
252d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
252e0 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20  rintf(" ");.    
252f0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
25300 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a  (p->pLeft);.  }.
25310 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20    if( p->pRight 
25320 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
25330 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a  bugPrintf(" ");.
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 2d 3e 70 52 69 67 68 74 29 3b  Expr(p->pRight);
25360 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
25370 62 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a  bugPrintf(")");.
25380 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  }.void sqlite3Pr
25390 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72  intExprList(Expr
253a0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
253b0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
253c0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
253d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
253e0 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69  te3PrintExpr(pLi
253f0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
25400 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74  .    if( i<pList
25410 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20  ->nExpr-1 ){.   
25420 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25430 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20  rintf(", ");.   
25440 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71   }.  }.}.void sq
25450 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
25460 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
25470 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74  indent){.  sqlit
25480 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
25490 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20  *sSELECT(%p) ", 
254a0 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a  indent, "", p);.
254b0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
254c0 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
254d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
254e0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
254f0 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a   if( p->pSrc ){.
25500 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69      char *zPrefi
25510 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  x;.    int i;.  
25520 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f    zPrefix = "FRO
25530 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  M";.    for(i=0;
25540 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
25550 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
25560 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
25570 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
25580 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
25590 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
255a0 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65  ntf("%*s ", inde
255b0 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a  nt+6, zPrefix);.
255c0 20 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20        zPrefix = 
255d0 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  "";.      if( pI
255e0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
255f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
25600 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22  ebugPrintf("(\n"
25610 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
25620 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49  e3PrintSelect(pI
25630 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e  tem->pSelect, in
25640 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20  dent+10);.      
25650 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25660 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64  intf("%*s)", ind
25670 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20  ent+8, "");.    
25680 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
25690 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
256a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
256b0 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74  Printf("%s", pIt
256c0 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
256d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
256e0 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  tem->pTab ){.   
256f0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
25700 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a  gPrintf("(table:
25710 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54   %s)", pItem->pT
25720 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
25730 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
25740 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
25750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
25760 62 75 67 50 72 69 6e 74 66 28 22 20 41 53 20 25  bugPrintf(" AS %
25770 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s", pItem->zAlia
25780 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
25790 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d    if( i<p->pSrc-
257a0 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20  >nSrc-1 ){.     
257b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
257c0 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20  rintf(",");.    
257d0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
257e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
257f0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
25800 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
25810 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
25820 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45  gPrintf("%*s WHE
25830 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  RE ", indent, ""
25840 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
25850 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  intExpr(p->pWher
25860 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
25870 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
25880 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
25890 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
258a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
258b0 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20  f("%*s GROUP BY 
258c0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
258d0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
258e0 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
258f0 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
25900 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
25910 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
25920 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
25930 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25940 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20  ntf("%*s HAVING 
25950 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
25960 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
25970 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29  Expr(p->pHaving)
25980 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
25990 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
259a0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
259b0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
259c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
259d0 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c  "%*s ORDER BY ",
259e0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
259f0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
25a00 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
25a10 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
25a20 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
25a30 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20  );.  }.}./* End 
25a40 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
25a50 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20   debug printing 
25a60 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  code.***********
25a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25ab0 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  **/.#endif /* de
25ac0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
25ad0 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
25ae0 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a     LITE_DEBUG) */.