/ Hex Artifact Content
Login

Artifact 3437b62b225528eef9cb61858584e86bb74ab35d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  iParm = iParm;. 
04a0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
04b0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
04c0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  Mem = 0;.  pDest
04d0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a  ->nMem = 0;.}...
04e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
04f0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0500: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0510: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0520: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0530: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0540: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0560: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0570: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0580: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0590: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
05a0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
05b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
05c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
05d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
05e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
05f0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0600: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0610: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0620: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0630: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0640: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0650: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0660: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0670: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0680: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0690: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
06a0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
06b0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
06c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
06d0: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
06e0: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
06f0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0700: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
0870: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
0880: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
0890: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08a0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08b0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08d0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
08e0: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
08f0: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0900: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0910: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65   = pEList;.  pNe
0920: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
0930: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
0940: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
0950: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0960: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
0970: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
0980: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
0990: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
09a0: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
09b0: 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46   isDistinct ? SF
09c0: 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20  _Distinct : 0;. 
09d0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53   pNew->op = TK_S
09e0: 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70  ELECT;.  pNew->p
09f0: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
0a00: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
0a10: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73  = pOffset;.  ass
0a20: 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20  ert( pOffset==0 
0a30: 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  || pLimit!=0 );.
0a40: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a50: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
0a60: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a70: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
0a80: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a90: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
0aa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0ab0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
0ac0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lect(db, pNew);.
0ad0: 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73      if( pNew!=&s
0ae0: 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33  tandin ) sqlite3
0af0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
0b00: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
0b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0b20: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  w;.}../*.** Dele
0b30: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
0b40: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
0b50: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
0b60: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
0b70: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0b80: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
0b90: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
0ba0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0bb0: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
0bc0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
0bd0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
0be0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
0bf0: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
0c00: 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74  ers preceeding t
0c10: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
0c20: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
0c30: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
0c40: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
0c50: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
0c60: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
0c70: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
0c80: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0c90: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
0ca0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
0cb0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53  .**     JT_CROSS
0cc0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
0cd0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
0ce0: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
0cf0: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
0d00: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
0d10: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
0d20: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
0d30: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
0d40: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
0d50: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
0d60: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
0d70: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
0d80: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
0d90: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
0da0: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
0db0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
0dc0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
0dd0: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50  qlite3JoinType(P
0de0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0df0: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0e00: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0e10: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0e20: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0e30: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0e40: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p;.             
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20  /*   0123456789 
0e70: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
0e80: 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61  789 123 */.  sta
0e90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
0ea0: 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74  KeyText[] = "nat
0eb0: 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74  uraleftouteright
0ec0: 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b  fullinnercross";
0ed0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0ee0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20  struct {.    u8 
0ef0: 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  i;        /* Beg
0f00: 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72  inning of keywor
0f10: 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65  d text in zKeyTe
0f20: 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e  xt[] */.    u8 n
0f30: 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67  Char;    /* Leng
0f40: 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72  th of the keywor
0f50: 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20  d in characters 
0f60: 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20  */.    u8 code; 
0f70: 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65      /* Join type
0f80: 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65   mask */.  } aKe
0f90: 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  yword[] = {.    
0fa0: 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20  /* natural */ { 
0fb0: 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41  0,  7, JT_NATURA
0fc0: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L               
0fd0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20   },.    /* left 
0fe0: 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a     */ { 6,  4, J
0ff0: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
1000: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1010: 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20  /* outer   */ { 
1020: 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  10, 5, JT_OUTER 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74   },.    /* right
1050: 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a     */ { 14, 5, J
1060: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
1070: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1080: 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20  /* full    */ { 
1090: 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a  19, 4, JT_LEFT|J
10a0: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
10b0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72   },.    /* inner
10c0: 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a     */ { 23, 5, J
10d0: 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20  T_INNER         
10e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
10f0: 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20  /* cross   */ { 
1100: 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c  28, 5, JT_INNER|
1110: 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20  JT_CROSS        
1120: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
1130: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
1140: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
1150: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
1160: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
1170: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1180: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1190: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
11a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79  for(j=0; j<Array
11b0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20  Size(aKeyword); 
11c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
11d0: 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a  p->n==aKeyword[j
11e0: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
11f0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
1200: 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e  NICmp((char*)p->
1210: 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65  z, &zKeyText[aKe
1220: 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e  yword[j].i], p->
1230: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
1240: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65   jointype |= aKe
1250: 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20  yword[j].code;. 
1260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1280: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c  testcase( j==0 |
1290: 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c  | j==1 || j==2 |
12a0: 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c  | j==3 || j==4 |
12b0: 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29  | j==5 || j==6 )
12c0: 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72  ;.    if( j>=Arr
12d0: 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29  aySize(aKeyword)
12e0: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
12f0: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
1300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1310: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
1320: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
1330: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1340: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
1350: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
1360: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
1370: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
1380: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1390: 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73  p = " ";.    ass
13a0: 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20  ert( pB!=0 );.  
13b0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
13c0: 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  Sp++; }.    sqli
13d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13e0: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
13f0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1400: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
1410: 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c  "%T %T%s%T", pA,
1420: 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20   pB, zSp, pC);. 
1430: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1440: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
1450: 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20  if( (jointype & 
1460: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
1470: 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74         && (joint
1480: 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1490: 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45  T_RIGHT))!=JT_LE
14a0: 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  FT ){.    sqlite
14b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14c0: 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20  , .      "RIGHT 
14d0: 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a  and FULL OUTER J
14e0: 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72  OINs are not cur
14f0: 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64  rently supported
1500: 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  ");.    jointype
1510: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1520: 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79  .  return jointy
1530: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  pe;.}../*.** Ret
1540: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
1550: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74   a column in a t
1560: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  able.  Return -1
1570: 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a   if the column.*
1580: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
1590: 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ed in the table.
15a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
15b0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65  olumnIndex(Table
15c0: 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68   *pTab, const ch
15d0: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74  ar *zCol){.  int
15e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
15f0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
1600: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1610: 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  e3StrICmp(pTab->
1620: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[i].zName, z
1630: 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Col)==0 ) return
1640: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1650: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   -1;.}../*.** Se
1660: 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e  arch the first N
1670: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c   tables in pSrc,
1680: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
1690: 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ght, looking for
16a0: 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74   a.** table that
16b0: 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61   has a column na
16c0: 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a  med zCol.  .**.*
16d0: 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65  * When found, se
16e0: 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69  t *piTab and *pi
16f0: 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65  Col to the table
1700: 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d   index and colum
1710: 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68  n index.** of th
1720: 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  e matching colum
1730: 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55  n and return TRU
1740: 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20  E..**.** If not 
1750: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41  found, return FA
1760: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
1770: 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  nt tableAndColum
1780: 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73  nIndex(.  SrcLis
1790: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f  t *pSrc,       /
17a0: 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65  * Array of table
17b0: 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  s to search */. 
17c0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
17d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17e0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  of tables in pSr
17f0: 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68  c->a[] to search
1800: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1810: 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61   *zCol,    /* Na
1820: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1830: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
1840: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  for */.  int *pi
1850: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
1860: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
1870: 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a  pSrc->a[] here *
1880: 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20  /.  int *piCol  
1890: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
18a0: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
18b0: 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d  >a[*piTab].pTab-
18c0: 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a  >aCol[] here */.
18d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
18e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
18f0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
1900: 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a  bles in pSrc */.
1910: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
1920: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1930: 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69  of column matchi
1940: 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73  ng zCol */..  as
1950: 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29  sert( (piTab==0)
1960: 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20  ==(piCol==0) ); 
1970: 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74   /* Both or neit
1980: 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a  her are NULL */.
1990: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
19a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  i++){.    iCol =
19b0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72   columnIndex(pSr
19c0: 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43  c->a[i].pTab, zC
19d0: 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  ol);.    if( iCo
19e0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l>=0 ){.      if
19f0: 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20  ( piTab ){.     
1a00: 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20     *piTab = i;. 
1a10: 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20         *piCol = 
1a20: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iCol;.      }.  
1a30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1a60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1a70: 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20  ed to add terms 
1a80: 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20  implied by JOIN 
1a90: 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a  syntax to the.**
1aa0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
1ab0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45  pression of a SE
1ac0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1ad0: 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68  The new term, wh
1ae0: 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20  ich.** is ANDed 
1af0: 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e  with the existin
1b00: 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  g WHERE clause, 
1b10: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
1b20: 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63  **.**    (tab1.c
1b30: 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29  ol1 = tab2.col2)
1b40: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
1b50: 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68  1 is the iSrc'th
1b60: 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73   table in SrcLis
1b70: 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20  t pSrc and tab2 
1b80: 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63  is the .** (iSrc
1b90: 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63  +1)'th. Column c
1ba0: 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  ol1 is column iC
1bb0: 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20  olLeft of tab1, 
1bc0: 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63  and col2 is.** c
1bd0: 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20  olumn iColRight 
1be0: 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74  of tab2..*/.stat
1bf0: 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65  ic void addWhere
1c00: 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1c10: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1c20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1c30: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
1c70: 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  s in FROM clause
1c80: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c   */.  int iLeft,
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1cb0: 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f  f first table to
1cc0: 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f   join in pSrc */
1cd0: 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c  .  int iColLeft,
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
1d00: 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74  olumn in first t
1d10: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1d20: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
1d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d40: 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62  ex of second tab
1d50: 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  le in pSrc */.  
1d60: 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20  int iColRight,  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
1d90: 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62  mn in second tab
1da0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75  le */.  int isOu
1db0: 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20  terJoin,        
1dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1dd0: 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55  if this is an OU
1de0: 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78  TER join */.  Ex
1df0: 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20  pr **ppWhere    
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45   IN/OUT: The WHE
1e20: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64  RE clause to add
1e30: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69   to */.){.  sqli
1e40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1e50: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
1e60: 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a  1;.  Expr *pE2;.
1e70: 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20    Expr *pEq;..  
1e80: 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52  assert( iLeft<iR
1e90: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1ea0: 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69  ( pSrc->nSrc>iRi
1eb0: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
1ec0: 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e   pSrc->a[iLeft].
1ed0: 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74  pTab );.  assert
1ee0: 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74  ( pSrc->a[iRight
1ef0: 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31  ].pTab );..  pE1
1f00: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1f10: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
1f20: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c  Src, iLeft, iCol
1f30: 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73  Left);.  pE2 = s
1f40: 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75  qlite3CreateColu
1f50: 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c  mnExpr(db, pSrc,
1f60: 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67   iRight, iColRig
1f70: 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71  ht);..  pEq = sq
1f80: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1f90: 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70  e, TK_EQ, pE1, p
1fa0: 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45  E2, 0);.  if( pE
1fb0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
1fc0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
1fd0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
1fe0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
1ff0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
2000: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  nyProperty(pEq, 
2010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2020: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2030: 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
2040: 6c 65 28 70 45 71 29 3b 0a 20 20 20 20 70 45 71  le(pEq);.    pEq
2050: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2060: 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54  e = (i16)pE2->iT
2070: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57  able;.  }.  *ppW
2080: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
2090: 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65  prAnd(db, *ppWhe
20a0: 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a  re, pEq);.}../*.
20b0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
20c0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
20d0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
20e0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
20f0: 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74  sion..** And set
2100: 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   the Expr.iRight
2110: 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61  JoinTable to iTa
2120: 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65  ble for every te
2130: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70  rm in the.** exp
2140: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
2150: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
2160: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
2170: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
2180: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
2190: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
21a0: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
21b0: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
21c0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
21d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
21e0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
21f0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
2200: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
2210: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
2220: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
2230: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
2240: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
2250: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
2260: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
2270: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
2280: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
2290: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
22a0: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
22b0: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
22c0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
22d0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
22e0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
22f0: 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68  inTable tells th
2300: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
2310: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74  rocessing that t
2320: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2330: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c   depends on tabl
2340: 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  e iRightJoinTabl
2350: 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74  e even if that t
2360: 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65  able is not.** e
2370: 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f  xplicitly mentio
2380: 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  ned in the expre
2390: 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66  ssion.  That inf
23a0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
23b0: 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20  ed.** for cases 
23c0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
23d0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23e0: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
23f0: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41  2 ON t1.a=t2.b A
2400: 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20  ND t1.x=5.**.** 
2410: 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  The where clause
2420: 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20   needs to defer 
2430: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2440: 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65  the t1.x=5.** te
2450: 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  rm until after t
2460: 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68  he t2 loop of th
2470: 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74  e join.  In that
2480: 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20   way, a.** NULL 
2490: 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69  t2 row will be i
24a0: 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72  nserted whenever
24b0: 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65   t1.x!=5.  If we
24c0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72   do not.** defer
24d0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
24e0: 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c   t1.x=5, it will
24f0: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d   be processed im
2500: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
2510: 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  er the t1 loop a
2520: 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e  nd rows with t1.
2530: 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20  x!=5 will never 
2540: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
2550: 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69   output, which i
2560: 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a  s incorrect..*/.
2570: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a  static void setJ
2580: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
2590: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
25a0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
25b0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
25c0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
25d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
25e0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
25f0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
2600: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2610: 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
2620: 75 63 69 62 6c 65 28 70 29 3b 0a 20 20 20 20 70  ucible(p);.    p
2630: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2640: 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b  e = (i16)iTable;
2650: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
2660: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
2670: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
2680: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
2690: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26a0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
26b0: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
26c0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
26d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
26e0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
26f0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
2700: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
2710: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2720: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
2730: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
2740: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
2750: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
2760: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
2770: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
2780: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2790: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
27a0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
27b0: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
27c0: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
27d0: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
27e0: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
27f0: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
2800: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
2810: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
2820: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
2830: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
2840: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
2850: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
2860: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
2870: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
2880: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
2890: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
28a0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
28b0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
28c0: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
28d0: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
28e0: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
28f0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2900: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2910: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2920: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
2930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
2940: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
2950: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2960: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
2970: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2990: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
29a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
29b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29e0: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
29f0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
2a00: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
2a10: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2a20: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
2a30: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
2a40: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
2a50: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
2a60: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
2a70: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
2a80: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
2a90: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
2aa0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
2ab0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
2ac0: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
2ad0: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
2ae0: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
2af0: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
2b00: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
2b10: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
2b20: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
2b30: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
2b40: 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20  VER(pLeftTab==0 
2b50: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
2b60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b70: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
2b80: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2b90: 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20  T_OUTER)!=0;..  
2ba0: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
2bb0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
2bc0: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
2bd0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2be0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
2bf0: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
2c00: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
2c10: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
2c20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2c30: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2c40: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
2c50: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2c60: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
2c70: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
2c80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2c90: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
2ca0: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
2cb0: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
2cc0: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
2cd0: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
2ce0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2d00: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
2d10: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2d20: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2d30: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
2d40: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
2d50: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
2d60: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
2d70: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
2d80: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
2d90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
2da0: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
2db0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
2dc0: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
2dd0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
2de0: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
2df0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
2e00: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
2e10: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
2e20: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
2e30: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
2e40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
2e50: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
2e60: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2e70: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
2e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e90: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
2ea0: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
2eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ec0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
2ed0: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
2ee0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2ef0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
2f00: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
2f10: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
2f20: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
2f30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2f40: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2f50: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2f60: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2f70: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2f80: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2f90: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2fa0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2fb0: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2fc0: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2fd0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2fe0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2ff0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3000: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3010: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3020: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3030: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3040: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3050: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3060: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3070: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3080: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3090: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
30a0: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
30b0: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
30c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
30d0: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
30e0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
30f0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3100: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3110: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3120: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3130: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3140: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3150: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3160: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3170: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3180: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3190: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
31a0: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
31b0: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
31c0: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
31d0: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
31e0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
31f0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3200: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3210: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3220: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3230: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3240: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3250: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3260: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3270: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3280: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3290: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
32a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
32b0: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
32c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
32d0: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
32e0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
32f0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3300: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3310: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3320: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3330: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3340: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3350: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3360: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3370: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3380: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3390: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
33a0: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
33b0: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
33c0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
33d0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
33e0: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
33f0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3400: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3410: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3420: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3430: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3440: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3450: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3460: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3470: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3480: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3490: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
34a0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
34b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
34c0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
34d0: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
34e0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
34f0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3500: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3510: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3520: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3530: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
3540: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
3550: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
3560: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
3570: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
3580: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
3590: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
35a0: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
35b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
35d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
35e0: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
35f0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
3600: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
3610: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
3620: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
3630: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
3640: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
3650: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3660: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
3670: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3680: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
3690: 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  erBy,    /* The 
36a0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
36b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
36c0: 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  lect,       /* T
36d0: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
36e0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
36f0: 6e 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20  nt regData      
3700: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
3710: 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74  r holding data t
3720: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29  o be sorted */.)
3730: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
3740: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
3750: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65  nt nExpr = pOrde
3760: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e  rBy->nExpr;.  in
3770: 74 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69  t regBase = sqli
3780: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
3790: 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29  pParse, nExpr+2)
37a0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  ;.  int regRecor
37b0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
37c0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
37d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
37e0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
37f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3800: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
3810: 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  , pOrderBy, regB
3820: 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ase, 0);.  sqlit
3830: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3840: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
3850: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3860: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
3870: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
3880: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
3890: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
38a0: 6e 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73  nExpr+1, 1);.  s
38b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
38c0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
38d0: 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  d, regBase, nExp
38e0: 72 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64  r + 2, regRecord
38f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3900: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
3910: 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79  Insert, pOrderBy
3920: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
3930: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
3940: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
3950: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
3960: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
3970: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
3980: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
3990: 45 78 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70  Expr+2);.  if( p
39a0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29  Select->iLimit )
39b0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
39c0: 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20   addr2;.    int 
39d0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
39e0: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
39f0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
3a00: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
3a10: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
3a20: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
3a30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
3a50: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
3a60: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
3a70: 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  ro, iLimit);.   
3a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3a90: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
3aa0: 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20   iLimit, -1);.  
3ab0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
3ac0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
3ad0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c  P_Goto);.    sql
3ae0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3af0: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
3b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b10: 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f  1(v, OP_Last, pO
3b20: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3b30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3b40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
3b50: 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d  elete, pOrderBy-
3b60: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
3b70: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3b80: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
3b90: 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d     pSelect->iLim
3ba0: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  it = 0;.  }.}../
3bb0: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
3bc0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
3bd0: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
3be0: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
3bf0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
3c00: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
3c10: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
3c20: 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  VM */.  Select *
3c30: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
3c40: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3c50: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
3c60: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
3c70: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
3c80: 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75  e to skip the cu
3c90: 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a  rrent record */.
3ca0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66  ){.  if( p->iOff
3cb0: 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65  set && iContinue
3cc0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  !=0 ){.    int a
3cd0: 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ddr;.    sqlite3
3ce0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3cf0: 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66  _AddImm, p->iOff
3d00: 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64  set, -1);.    ad
3d10: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
3d20: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
3d30: 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b  eg, p->iOffset);
3d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3d50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
3d60: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
3d70: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
3d80: 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53  t((v, "skip OFFS
3d90: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
3da0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3db0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
3dc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3dd0: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
3de0: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
3df0: 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74  ure the N regist
3e00: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
3e10: 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64  iMem.** form a d
3e20: 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20  istinct entry.  
3e30: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
3e40: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
3e50: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
3e60: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
3e70: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
3e80: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
3e90: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
3ea0: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
3eb0: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
3ec0: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
3ed0: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
3ee0: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
3ef0: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
3f00: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
3f10: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
3f20: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
3f30: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
3f40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3f50: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50  odeDistinct(.  P
3f60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3f70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
3f80: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
3f90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
3fa0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
3fb0: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
3fc0: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
3fd0: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
3fe0: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
3ff0: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
4000: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
4010: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
4020: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
4030: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
4040: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
4050: 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20   iMem           
4060: 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74  /* First element
4070: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
4080: 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76  ;.  int r1;..  v
4090: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
40a0: 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
40b0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
40c0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
40d0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
40e0: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
40f0: 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20  drRepeat, iMem, 
4100: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  N);.  sqlite3Vdb
4110: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4120: 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20  keRecord, iMem, 
4130: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
4140: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4150: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
4160: 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  b, r1);.  sqlite
4170: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
4180: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
4190: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
41a0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
41b0: 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73  when a SELECT is
41c0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73   used within a s
41d0: 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
41e0: 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e  (example:  "a IN
41f0: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
4200: 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20  table)") but it 
4210: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20  has more than 1 
4220: 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  result.** column
4230: 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e  .  We do this in
4240: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65   a subroutine be
4250: 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20  cause the error 
4260: 6f 63 63 75 72 73 20 69 6e 20 6d 75 6c 74 69 70  occurs in multip
4270: 6c 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f  le.** places..*/
4280: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
4290: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
42a0: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
42b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
42c0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
42d0: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
42e0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
42f0: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
4300: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
4310: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
4320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4330: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
4340: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
4350: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
4360: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4370: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
4380: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
4390: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
43a0: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
43b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
43c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
43d0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
43e0: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
43f0: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
4400: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
4410: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
4420: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
4430: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
4440: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
4450: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4460: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
4470: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
4480: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
4490: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
44a0: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
44b0: 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75  srcTab and nColu
44c0: 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f  mn are both zero
44d0: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
44e0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
44f0: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
4500: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
4510: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
4520: 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d   row.  If nColum
4530: 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61  n>0.** then data
4540: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
4550: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
4560: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  t is used only t
4570: 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o get the.** dat
4580: 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20  atypes for each 
4590: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
45a0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
45b0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
45c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
45d0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
45e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
45f0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
4600: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
4610: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
4620: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
4630: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
4640: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
4650: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
4660: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
4670: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
4680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4690: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
46a0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
46b0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
46c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
46d0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
46e0: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
46f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4700: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
4710: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
4720: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
4730: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69   this key */.  i
4740: 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20  nt distinct,    
4750: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30         /* If >=0
4760: 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75  , make sure resu
4770: 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74  lts are distinct
4780: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
4790: 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
47a0: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
47b0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
47c0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
47d0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
47e0: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
47f0: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
4800: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
4810: 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
4820: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
4830: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
4840: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29   inner loop */.)
4850: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4860: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
4870: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
4880: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
4890: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
48a0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
48b0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
48c0: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
48e0: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
48f0: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65  olding result se
4900: 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  t */.  int eDest
4910: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
4920: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
4930: 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20  pose of results 
4940: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  */.  int iParm =
4950: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 20 20   pDest->iParm;  
4960: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
4970: 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d  nt to disposal m
4980: 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ethod */.  int n
4990: 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20  ResultCol;      
49a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
49b0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
49c0: 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ns */..  assert(
49d0: 20 76 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45   v );.  if( NEVE
49e0: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
49f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
4a00: 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69  st!=0 );.  hasDi
4a10: 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63  stinct = distinc
4a20: 74 3e 3d 30 3b 0a 20 20 69 66 28 20 70 4f 72 64  t>=0;.  if( pOrd
4a30: 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44  erBy==0 && !hasD
4a40: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63  istinct ){.    c
4a50: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
4a60: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  iContinue);.  }.
4a70: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
4a80: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
4a90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f  ..  */.  if( nCo
4aa0: 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e 52  lumn>0 ){.    nR
4ab0: 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c 75  esultCol = nColu
4ac0: 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mn;.  }else{.   
4ad0: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45   nResultCol = pE
4ae0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
4af0: 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d  .  if( pDest->iM
4b00: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65  em==0 ){.    pDe
4b10: 73 74 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  st->iMem = pPars
4b20: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
4b30: 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e 52 65  Dest->nMem = nRe
4b40: 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 50 61  sultCol;.    pPa
4b50: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
4b60: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
4b70: 7b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  { .    assert( p
4b80: 44 65 73 74 2d 3e 6e 4d 65 6d 3d 3d 6e 52 65 73  Dest->nMem==nRes
4b90: 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20  ultCol );.  }.  
4ba0: 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73  regResult = pDes
4bb0: 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28 20 6e  t->iMem;.  if( n
4bc0: 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20  Column>0 ){.    
4bd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
4be0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
4bf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c00: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
4c10: 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65  srcTab, i, regRe
4c20: 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20  sult+i);.    }. 
4c30: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
4c40: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
4c50: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
4c60: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
4c70: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
4c80: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
4c90: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
4ca0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
4cb0: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
4cc0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
4cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4ce0: 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
4cf0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
4d00: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
4d10: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
4d20: 72 65 67 52 65 73 75 6c 74 2c 20 65 44 65 73 74  regResult, eDest
4d30: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a 20  ==SRT_Output);. 
4d40: 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e   }.  nColumn = n
4d50: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a  ResultCol;..  /*
4d60: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
4d70: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
4d80: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
4d90: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
4da0: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
4db0: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
4dc0: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
4dd0: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
4de0: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
4df0: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
4e00: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
4e10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
4e20: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
4e30: 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
4e40: 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  Expr==nColumn );
4e50: 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63  .    codeDistinc
4e60: 74 28 70 50 61 72 73 65 2c 20 64 69 73 74 69 6e  t(pParse, distin
4e70: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
4e80: 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75 6c  Column, regResul
4e90: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  t);.    if( pOrd
4ea0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
4eb0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
4ec0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
4ed0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63    }.  }..  if( c
4ee0: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
4ef0: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
4f00: 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
4f10: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
4f20: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
4f30: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
4f40: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
4f50: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
4f60: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
4f70: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
4f80: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
4f90: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
4fa0: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
4fb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
4fc0: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63  UND_SELECT.    c
4fd0: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b  ase SRT_Union: {
4fe0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
4ff0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
5000: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
5010: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
5020: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5030: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
5040: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5050: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  n, r1);.      sq
5060: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5070: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
5080: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
5090: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
50a0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
50b0: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
50c0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
50d0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
50e0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
50f0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
5100: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
5110: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
5120: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
5130: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
5140: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
5150: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
5160: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
5170: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5180: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
5190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
51a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
51b0: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
51c0: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29  Result, nColumn)
51d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
51e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
51f0: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
5200: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
5210: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
5220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5230: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
5240: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
5250: 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
5260: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
5270: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5280: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
5290: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
52a0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
52b0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  e( eDest==SRT_Ep
52c0: 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
52d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
52e0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
52f0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
5300: 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20  Column, r1);.   
5310: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
5320: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
5330: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5340: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5350: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
5360: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
5370: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5380: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
5390: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
53a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
53b0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
53c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
53d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
53e0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
53f0: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
5400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5410: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
5420: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
5430: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5440: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5450: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
5460: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
5470: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5480: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
5490: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
54a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
54b0: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
54c0: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
54d0: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
54e0: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
54f0: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
5500: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
5510: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
5520: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
5530: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
5540: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
5550: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
5560: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
5570: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
5580: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
5590: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
55a0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
55b0: 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73   p->affinity = s
55c0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
55d0: 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b  inity(pEList->a[
55e0: 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
55f0: 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20  >affinity);.    
5600: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5610: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
5620: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
5630: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
5640: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
5650: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
5660: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
5670: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
5680: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
5690: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
56a0: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
56b0: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
56c0: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
56d0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
56e0: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
56f0: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
5700: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
5710: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5720: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
5730: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52  OrderBy, p, regR
5740: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65  esult);.      }e
5750: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
5760: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5770: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5780: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5790: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
57a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
57b0: 52 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26  Result, 1, r1, &
57c0: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
57d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
57e0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
57f0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
5800: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
5810: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5820: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5830: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
5840: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
5850: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5860: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
5870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5880: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5890: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
58a0: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
58b0: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
58c0: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
58d0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
58e0: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
58f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5900: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5910: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72  Integer, 1, iPar
5920: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
5930: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
5940: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
5950: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
5960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5970: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5980: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
5990: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
59a0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
59b0: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
59c0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
59d0: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
59e0: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
59f0: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
5a00: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
5a10: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
5a20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
5a30: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5a40: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
5a50: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
5a60: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
5a70: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
5a80: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
5a90: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
5aa0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5ab0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
5ac0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
5ad0: 65 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c  egResult, iParm,
5ae0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20   1);.        /* 
5af0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
5b00: 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
5b10: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
5b20: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
5b30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5b40: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
5b50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
5b60: 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
5b70: 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20  * Send the data 
5b80: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
5b90: 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61  function or to a
5ba0: 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e   subroutine.  In
5bb0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65   the.    ** case
5bc0: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
5bd0: 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
5be0: 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f   itself is respo
5bf0: 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a  nsible for.    *
5c00: 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61  * popping the da
5c10: 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ta from the stac
5c20: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  k..    */.    ca
5c30: 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
5c40: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f  :.    case SRT_O
5c50: 75 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 74  utput: {.      t
5c60: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
5c70: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
5c80: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5c90: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
5ca0: 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
5cb0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5cc0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
5cd0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5ce0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5cf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d00: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5d10: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
5d20: 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20  Column, r1);.   
5d30: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
5d40: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
5d50: 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20  erBy, p, r1);.  
5d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
5d70: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
5d80: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  se, r1);.      }
5d90: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d  else if( eDest==
5da0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
5db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5dc0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5dd0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
5de0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Parm);.      }el
5df0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5e00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5e10: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
5e20: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5e30: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
5e40: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
5e50: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
5e60: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  e, regResult, nC
5e70: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
5e80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5e90: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
5ea0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
5eb0: 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
5ec0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
5ed0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
5ee0: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
5ef0: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
5f00: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
5f10: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
5f20: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
5f30: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
5f40: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
5f50: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
5f60: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
5f70: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
5f80: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
5f90: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
5fa0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
5fb0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
5fc0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5fd0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
5fe0: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
5ff0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6000: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
6010: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
6020: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
6030: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
6040: 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
6050: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
6060: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6070: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 20 20 2f  OrderBy==0 );  /
6080: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
6090: 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 63   ORDER BY, the c
60a0: 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20  all to.         
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 2a 2a 20 70 75 73 68 4f 6e 74 6f 53 6f     ** pushOntoSo
60d0: 72 74 65 72 28 29 20 77 6f 75 6c 64 20 68 61 76  rter() would hav
60e0: 65 20 63 6c 65 61 72 65 64 20 70 2d 3e 69 4c 69  e cleared p->iLi
60f0: 6d 69 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  mit */.    sqlit
6100: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6110: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
6120: 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31  imit, iBreak, -1
6130: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6140: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
6150: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
6160: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
6170: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
6180: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
6190: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
61a0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
61b0: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
61c0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
61d0: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
61e0: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
61f0: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
6200: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
6210: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
6220: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
6230: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
6240: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
6250: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
6260: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
6270: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
6280: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
6290: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
62a0: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
62b0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
62c0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
62d0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
62e0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
62f0: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
6300: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
6310: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
6320: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
6330: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
6340: 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d  is obtain from m
6350: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
6360: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
6370: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
6380: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
6390: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
63a0: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
63b0: 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b  reed.  Add the K
63c0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
63d0: 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c 64   to the P4 field
63e0: 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73   of an opcode us
63f0: 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46  ing.** P4_KEYINF
6400: 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65  O_HANDOFF is the
6410: 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65   usual way of de
6420: 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e  aling with this.
6430: 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
6440: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
6450: 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70  xprList(Parse *p
6460: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
6470: 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pList){.  sqlit
6480: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6490: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  >db;.  int nExpr
64a0: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
64b0: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
64c0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
64d0: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  m;.  int i;..  n
64e0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
64f0: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
6500: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6510: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
6520: 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73  Info) + nExpr*(s
6530: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
6540: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
6550: 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  o ){.    pInfo->
6560: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
6570: 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  *)&pInfo->aColl[
6580: 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66  nExpr];.    pInf
6590: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  o->nField = (u16
65a0: 29 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66  )nExpr;.    pInf
65b0: 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  o->enc = ENC(db)
65c0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64 62 20  ;.    pInfo->db 
65d0: 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = db;.    for(i=
65e0: 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
65f0: 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  a; i<nExpr; i++,
6600: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
6610: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6620: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
6630: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
6640: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
6650: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
6660: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
6670: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
6680: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
6690: 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d    }.      pInfo-
66a0: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
66b0: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
66c0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
66d0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
66e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
66f0: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a  turn pInfo;.}...
6700: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
6710: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
6720: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
6730: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
6740: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
6750: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
6760: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
6770: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
6780: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
6790: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
67a0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
67b0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
67c0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
67d0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
67e0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
67f0: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
6800: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
6810: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
6820: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
6830: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
6840: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
6850: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
6860: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
6870: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6880: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20   */.  Vdbe *v,  
6890: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
68a0: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
68b0: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
68c0: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
68d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
68e0: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
68f0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
6900: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
6910: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
6920: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
6930: 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
6940: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
6950: 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70  (v);     /* Jump
6960: 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f   here to exit lo
6970: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
6980: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
6990: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
69a0: 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  v);  /* Jump her
69b0: 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65  e for next cycle
69c0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a   */.  int addr;.
69d0: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e    int iTab;.  in
69e0: 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b  t pseudoTab = 0;
69f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
6a00: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
6a10: 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73  rBy;..  int eDes
6a20: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
6a30: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
6a40: 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20  pDest->iParm;.. 
6a50: 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69   int regRow;.  i
6a60: 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20  nt regRowid;..  
6a70: 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d  iTab = pOrderBy-
6a80: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65 67  >iECursor;.  reg
6a90: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Row = sqlite3Get
6aa0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6ab0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
6ac0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
6ad0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6ae0: 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61   ){.    pseudoTa
6af0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
6b00: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
6b10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b20: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75  OpenPseudo, pseu
6b30: 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20 6e  doTab, regRow, n
6b40: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65 67  Column);.    reg
6b50: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c  Rowid = 0;.  }el
6b60: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
6b70: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
6b80: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
6b90: 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73  }.  addr = 1 + s
6ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6bb0: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
6bc0: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
6bd0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
6be0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
6bf0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6c00: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
6c10: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
6c20: 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 72 65  y->nExpr + 1, re
6c30: 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63 68 28  gRow);.  switch(
6c40: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
6c50: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
6c60: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
6c70: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  Tab: {.      tes
6c80: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
6c90: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
6ca0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
6cb0: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
6cc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6cd0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6ce0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
6cf0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6d00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6d10: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
6d20: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c  , iParm, regRow,
6d30: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6d50: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
6d60: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62  APPEND);.      b
6d70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
6d80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6d90: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
6da0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
6db0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
6dc0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
6dd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6de0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6df0: 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65  d, regRow, 1, re
6e00: 67 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66 69  gRowid, &p->affi
6e10: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
6e20: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6e30: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
6e40: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31  Parse, regRow, 1
6e50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6e60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6e70: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
6e80: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
6e90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6ea0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
6eb0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
6ec0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6ed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6ee0: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
6ef0: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
6f00: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
6f10: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
6f20: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
6f30: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
6f40: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
6f50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
6f60: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
6f70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73   int i;.      as
6f80: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
6f90: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
6fa0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6fb0: 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61  ); .      testca
6fc0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
6fd0: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74  utput );.      t
6fe0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
6ff0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
7000: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7010: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
7020: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7030: 20 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e   regRow!=pDest->
7040: 69 4d 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20  iMem+i );.      
7050: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7060: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
7070: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20  , pseudoTab, i, 
7080: 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a  pDest->iMem+i);.
7090: 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30          if( i==0
70a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
70b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
70c0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41  5(v, OPFLAG_CLEA
70d0: 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20  RCACHE);.       
70e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
70f0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
7100: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
7110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7120: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
7130: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  Row, pDest->iMem
7140: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
7150: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7160: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
7170: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
7180: 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29  ->iMem, nColumn)
7190: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
71a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
71b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
71c0: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61  ield, pDest->iPa
71d0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
71e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
71f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
7200: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
7210: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
7220: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7230: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
7240: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 4c 49  Rowid);..  /* LI
7250: 4d 49 54 20 68 61 73 20 62 65 65 6e 20 69 6d 70  MIT has been imp
7260: 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20  lemented by the 
7270: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29  pushOntoSorter()
7280: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
7290: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4c 69 6d   assert( p->iLim
72a0: 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54  it==0 );..  /* T
72b0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
72c0: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
72d0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
72e0: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
72f0: 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
7300: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7310: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
7320: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
7330: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
7340: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
7350: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
7360: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
7370: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
7380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7390: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
73a0: 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  e, pseudoTab, 0)
73b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
73c0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
73d0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
73e0: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
73f0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
7400: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
7410: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
7420: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
7430: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
7440: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
7450: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
7460: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
7470: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
7480: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
7490: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
74a0: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
74b0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
74c0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
74d0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
74e0: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
74f0: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
7500: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
7510: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
7520: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
7530: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
7540: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
7550: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
7560: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
7570: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
7580: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
7590: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
75a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
75b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
75c0: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
75d0: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
75e0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
75f0: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
7600: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
7610: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
7620: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
7630: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
7640: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
7650: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
7660: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
7670: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
7680: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
7690: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
76a0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
76b0: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
76c0: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  mn is NULL..*/.s
76d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
76e0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20   *columnType(.  
76f0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
7700: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
7710: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7720: 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63  *pzOriginDb,.  c
7730: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
7740: 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74  iginTab,.  const
7750: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
7760: 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  Col.){.  char co
7770: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
7780: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
7790: 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63  riginDb = 0;.  c
77a0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
77b0: 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  inTab = 0;.  cha
77c0: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
77d0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  Col = 0;.  int j
77e0: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  ;.  if( NEVER(pE
77f0: 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e  xpr==0) || pNC->
7800: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
7810: 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63  turn 0;..  switc
7820: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
7830: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
7840: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
7850: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
7860: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
7870: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
7880: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
7890: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
78a0: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
78b0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
78c0: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
78d0: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
78e0: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
78f0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
7900: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
7910: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
7920: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
7930: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
7940: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
7950: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
7960: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
7970: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
7980: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
7990: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
79a0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
79b0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
79c0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
79d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
79e0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
79f0: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
7a00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
7a10: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
7a20: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
7a30: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
7a40: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
7a50: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
7a60: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
7a70: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
7a80: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
7a90: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
7aa0: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
7ab0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
7ac0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
7ad0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
7ae0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
7af0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
7b00: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
7b10: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
7b20: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
7b30: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
7b40: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
7b50: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
7b60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
7b70: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
7b80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7b90: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
7ba0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
7bb0: 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c   /* At one time,
7bc0: 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53   code such as "S
7bd0: 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74  ELECT new.x" wit
7be0: 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f  hin a trigger wo
7bf0: 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  uld.        ** c
7c00: 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74  ause this condit
7c10: 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e  ion to run.  Sin
7c20: 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65  ce then, we have
7c30: 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f   restructured ho
7c40: 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69  w.        ** tri
7c50: 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e  gger code is gen
7c60: 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68  erated and so th
7c70: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
7c80: 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20  no longer .     
7c90: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
7ca0: 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  However, it can 
7cb0: 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f  still be true fo
7cc0: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b  r statements lik
7cd0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
7ce0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
7cf0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
7d00: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
7d10: 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29   t1(col INTEGER)
7d20: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ;.        **   S
7d30: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31  ELECT (SELECT t1
7d40: 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20  .col) FROM FROM 
7d50: 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  t1;.        **. 
7d60: 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63         ** when c
7d70: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
7d80: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
7d90: 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22  ression "t1.col"
7da0: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20   in the .       
7db0: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20   ** sub-select. 
7dc0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
7dd0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  t the column typ
7de0: 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a  e to NULL, even.
7df0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67          ** thoug
7e00: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c  h it should real
7e10: 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e  ly be "INTEGER".
7e20: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
7e30: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
7e40: 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73  ot a problem, as
7e50: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
7e60: 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20   of "t1.col" is 
7e70: 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  never.        **
7e80: 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75   used. When colu
7e90: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
7ea0: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
7eb0: 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  sion .        **
7ec0: 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c   "(SELECT t1.col
7ed0: 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  )", the correct 
7ee0: 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64  type is returned
7ef0: 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c   (see the TK_SEL
7f00: 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ECT.        ** b
7f10: 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f  ranch below.  */
7f20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7f30: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
7f40: 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70  ssert( pTab && p
7f50: 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62  Expr->pTab==pTab
7f60: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
7f80: 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63  he "table" is ac
7f90: 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c  tually a sub-sel
7fa0: 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e  ect or a view in
7fb0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7fc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
7fd0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
7fe0: 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ent. Return the 
7ff0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
8000: 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20   and origin.    
8010: 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20      ** data for 
8020: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63  the result-set c
8030: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62  olumn of the sub
8040: 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20  -select..       
8050: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
8060: 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59  iCol>=0 && ALWAY
8070: 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73  S(iCol<pS->pELis
8080: 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
8090: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
80a0: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
80b0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
80c0: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
80d0: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
80e0: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
80f0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
8100: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
8110: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
8120: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
8130: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
8140: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
8150: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
8160: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
8170: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
8180: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
8190: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
81a0: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
81b0: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
81c0: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
81d0: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
81e0: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
81f0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
8200: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
8210: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
8220: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
8230: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
8240: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
8250: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
8260: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
8270: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
8280: 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62   if( ALWAYS(pTab
8290: 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20 20  ->pSchema) ){.  
82a0: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
82b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
82c0: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
82d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
82e0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
82f0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
8300: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
8310: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
8320: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
8330: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
8340: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
8350: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
8360: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
8370: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22    zOriginCol = "
8380: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
8390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
83a0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
83b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
83c0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
83d0: 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  inCol = pTab->aC
83e0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
83f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8400: 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70    zOriginTab = p
8410: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
8420: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
8430: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
8440: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
8450: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
8460: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
8470: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
8480: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
8490: 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  inDb = pNC->pPar
84a0: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
84b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
84c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
84d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
84e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
84f0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
8500: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
8510: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
8520: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
8530: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
8540: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
8550: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
8560: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
8570: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
8580: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
8590: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
85a0: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
85b0: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
85c0: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
85d0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
85e0: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
85f0: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
8600: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
8610: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
8620: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
8630: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
8640: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
8650: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
8660: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
8670: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
8680: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
8690: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
86a0: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
86b0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
86c0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
86d0: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
86e0: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
86f0: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
8700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
8710: 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66  ndif.  }.  .  if
8720: 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a  ( pzOriginDb ){.
8730: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
8740: 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69  iginTab && pzOri
8750: 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  ginCol );.    *p
8760: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69  zOriginDb = zOri
8770: 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  ginDb;.    *pzOr
8780: 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69  iginTab = zOrigi
8790: 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  nTab;.    *pzOri
87a0: 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e  ginCol = zOrigin
87b0: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Col;.  }.  retur
87c0: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
87d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
87e0: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
87f0: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
8800: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
8810: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
8820: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
8830: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
8840: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
8850: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
8860: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
8870: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
8880: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
8890: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
88a0: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
88b0: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
88c0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
88d0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
88e0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e  t set */.){.#ifn
88f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8900: 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20  DECLTYPE.  Vdbe 
8910: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
8920: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  be;.  int i;.  N
8930: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
8940: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
8950: 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43   pTabList;.  sNC
8960: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
8970: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8980: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
8990: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
89a0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
89b0: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
89c0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66  char *zType;.#if
89d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
89e0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
89f0: 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  A.    const char
8a00: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
8a10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8a20: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20  OrigTab = 0;.   
8a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
8a40: 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a  igCol = 0;.    z
8a50: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
8a60: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
8a70: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
8a80: 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20  &zOrigCol);..   
8a90: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
8aa0: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
8ab0: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
8ac0: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
8ad0: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
8ae0: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
8af0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
8b00: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
8b10: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
8b20: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
8b30: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
8b40: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
8b50: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8b60: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
8b70: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
8b80: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
8b90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8ba0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8bb0: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
8bc0: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
8bd0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
8be0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8bf0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8c00: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
8c10: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
8c20: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
8c30: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
8c40: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
8c50: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
8c60: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
8c70: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8c80: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
8c90: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
8ca0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
8cb0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8cc0: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
8cd0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   */.}../*.** Gen
8ce0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
8cf0: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
8d00: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
8d10: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
8d20: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
8d30: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
8d40: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
8d50: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
8d60: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
8d70: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
8d80: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
8d90: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
8da0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8db0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
8dc0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
8dd0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
8de0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
8df0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8e00: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
8e10: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
8e20: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
8e30: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
8e40: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
8e50: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
8e60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8e70: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
8e80: 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74  fullNames, short
8e90: 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  Names;..#ifndef 
8ea0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
8eb0: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
8ec0: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
8ed0: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
8ee0: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
8ef0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
8f00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
8f10: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
8f20: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
8f30: 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64  NEVER(v==0) || d
8f40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8f50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
8f60: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
8f70: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
8f80: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
8f90: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
8fa0: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
8fb0: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
8fc0: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
8fd0: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
8fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
8ff0: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
9000: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
9010: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
9020: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9030: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
9040: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
9050: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  xpr;.    if( NEV
9060: 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69  ER(p==0) ) conti
9070: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
9080: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
9090: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
90a0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
90b0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
90c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
90d0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
90e0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
90f0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
9100: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
9110: 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( (p->op==TK_CO
9120: 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  LUMN || p->op==T
9130: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26  K_AGG_COLUMN) &&
9140: 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20   pTabList ){.   
9150: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
9160: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
9170: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
9180: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
9190: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c       for(j=0; AL
91a0: 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d  WAYS(j<pTabList-
91b0: 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20  >nSrc); j++){.  
91c0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69        if( pTabLi
91d0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
91e0: 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72  ==p->iTable ) br
91f0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9200: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
9210: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
9220: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
9230: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
9240: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
9250: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
9260: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
9270: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
9280: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
9290: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
92a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
92b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
92c0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
92d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
92e0: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
92f0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
9300: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9310: 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20  if( !shortNames 
9320: 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  && !fullNames ){
9330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9340: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
9350: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
9360: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
9370: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9380: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  db, pEList->a[i]
9390: 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f  .zSpan), SQLITE_
93a0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
93b0: 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61  }else if( fullNa
93c0: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63  mes ){.        c
93d0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
93e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
93f0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9400: 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
9410: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
9420: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9430: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9440: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
9450: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
9460: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
9470: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9480: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
9490: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
94a0: 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
94b0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
94c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
94d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
94e0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
94f0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
9500: 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  AME, .          
9510: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9520: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  db, pEList->a[i]
9530: 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f  .zSpan), SQLITE_
9540: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a  DYNAMIC);.    }.
9550: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
9560: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
9570: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
9580: 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  st);.}..#ifndef 
9590: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
95a0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
95b0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
95c0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
95d0: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
95e0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
95f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
9600: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
9610: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
9620: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
9630: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
9640: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
9650: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
9660: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9670: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
9680: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
9690: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
96a0: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
96b0: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
96c0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
96d0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
96e0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
96f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
9700: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
9710: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
9720: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
9730: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  /../*.** Given a
9740: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
9750: 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
9760: 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
9770: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
9780: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
9790: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
97a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
97b0: 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
97c0: 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
97d0: 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
97e0: 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
97f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
9800: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
9810: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
9820: 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
9830: 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
9840: 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
9850: 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
9860: 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
9870: 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
9880: 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
9890: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
98a0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
98b0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
98c0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
98d0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
98e0: 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
98f0: 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
9900: 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
9910: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
9920: 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63  NOMEM..*/.static
9930: 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d   int selectColum
9940: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  nsFromExprList(.
9950: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
9970: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9980: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
9990: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70  st,       /* Exp
99a0: 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63  r list from whic
99b0: 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75  h to derive colu
99c0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  mn names */.  in
99d0: 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20  t *pnCol,       
99e0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
99f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
9a00: 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43  umns here */.  C
9a10: 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20  olumn **paCol   
9a20: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
9a30: 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c  the new column l
9a40: 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ist here */.){. 
9a50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9a60: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
9a70: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
9a80: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ion */.  int i, 
9a90: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
9aa0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9ab0: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
9ac0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
9ad0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9ae0: 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  added to make th
9af0: 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f  e name unique */
9b00: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
9b10: 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f   *pCol;        /
9b20: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
9b30: 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  er result column
9b40: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  s */.  int nCol;
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9b70: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
9b80: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45  esult set */.  E
9b90: 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  xpr *p;         
9ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
9bb0: 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73  pression for a s
9bc0: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c  ingle result col
9bd0: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  umn */.  char *z
9be0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
9bf0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
9c00: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ame */.  int nNa
9c10: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
9c20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9c30: 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20  name in zName[] 
9c40: 2a 2f 0a 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e  */..  *pnCol = n
9c50: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
9c60: 78 70 72 3b 0a 20 20 61 43 6f 6c 20 3d 20 2a 70  xpr;.  aCol = *p
9c70: 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  aCol = sqlite3Db
9c80: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
9c90: 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e  izeof(aCol[0])*n
9ca0: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 61 43 6f 6c  Col);.  if( aCol
9cb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
9cc0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f 72  ITE_NOMEM;.  for
9cd0: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
9ce0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43   i<nCol; i++, pC
9cf0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65  ol++){.    /* Ge
9d00: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
9d10: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
9d20: 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
9d30: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
9d40: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
9d50: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
9d60: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
9d70: 72 74 79 28 70 2d 3e 70 52 69 67 68 74 2c 20 45  rty(p->pRight, E
9d80: 50 5f 49 6e 74 56 61 6c 75 65 29 0a 20 20 20 20  P_IntValue).    
9d90: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
9da0: 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65  >pRight->u.zToke
9db0: 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  n==0 || p->pRigh
9dc0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d  t->u.zToken[0]!=
9dd0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  0 );.    if( (zN
9de0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
9df0: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
9e00: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
9e10: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
9e20: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
9e30: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
9e40: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
9e50: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
9e60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
9e70: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
9e80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
9e90: 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20   *pColExpr = p; 
9ea0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
9eb0: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72  on that is the r
9ec0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
9ed0: 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
9ee0: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
9ef0: 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61  /* Table associa
9f00: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78  ted with this ex
9f10: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
9f20: 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
9f30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 20  r->op==TK_DOT ) 
9f40: 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45  pColExpr = pColE
9f50: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
9f60: 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
9f70: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
9f80: 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70  & ALWAYS(pColExp
9f90: 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  r->pTab!=0) ){. 
9fa0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
9fb0: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
9fc0: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
9fd0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
9fe0: 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
9ff0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
a000: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
a010: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
a020: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
a030: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
a040: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a050: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
a060: 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20  b, "%s",.       
a070: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d            iCol>=
a080: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
a090: 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f  Col].zName : "ro
a0a0: 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wid");.      }el
a0b0: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
a0c0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
a0d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
a0e0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a0f0: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
a100: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
a110: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
a120: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
a130: 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  , pColExpr->u.zT
a140: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
a150: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  se{.        /* U
a160: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
a170: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
a180: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
a190: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
a1a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
a1b0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
a1c0: 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  "%s", pEList->a[
a1d0: 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  i].zSpan);.     
a1e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
a1f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a200: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
a210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
a220: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
a230: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a240: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
a250: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
a260: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
a270: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
a280: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
a290: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
a2a0: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
a2b0: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
a2c0: 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65      */.    nName
a2d0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a2e0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  30(zName);.    f
a2f0: 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b  or(j=cnt=0; j<i;
a300: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
a310: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a320: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[j].zName, z
a330: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
a340: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61      char *zNewNa
a350: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  me;.        zNam
a360: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
a370: 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d        zNewName =
a380: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
a390: 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61  db, "%s:%d", zNa
a3a0: 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
a3b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a3c0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
a3d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e        zName = zN
a3e0: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
a3f0: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  j = -1;.        
a400: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62  if( zName==0 ) b
a410: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a420: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
a430: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d  ame = zName;.  }
a440: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
a450: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
a460: 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  or(j=0; j<i; j++
a470: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a480: 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b  DbFree(db, aCol[
a490: 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  j].zName);.    }
a4a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
a4b0: 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20  ee(db, aCol);.  
a4c0: 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20    *paCol = 0;.  
a4d0: 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20    *pnCol = 0;.  
a4e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4f0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
a500: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a510: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65  ../*.** Add type
a520: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
a530: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20  nformation to a 
a540: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65  column list base
a550: 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54  d on.** a SELECT
a560: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a   statement..** .
a570: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
a580: 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61  st presumably ca
a590: 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f  me from selectCo
a5a0: 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70  lumnNamesFromExp
a5b0: 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20  rList()..** The 
a5c0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20  column list has 
a5d0: 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20  only names, not 
a5e0: 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69  types or collati
a5f0: 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ons.  This.** ro
a600: 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75  utine goes throu
a610: 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20  gh and adds the 
a620: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
a630: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
a640: 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65   routine require
a650: 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74  s that all ident
a660: 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45  ifiers in the SE
a670: 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
a680: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  t be resolved..*
a690: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
a6a0: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
a6b0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eAndCollation(. 
a6c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a6d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
a6e0: 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20  g contexts */.  
a6f0: 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  int nCol,       
a700: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a710: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
a720: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20  Column *aCol,   
a730: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
a740: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65   columns */.  Se
a750: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
a760: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
a770: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a780: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
a790: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
a7a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a7b0: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
a7c0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
a7d0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
a7e0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
a7f0: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
a800: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a810: 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73  t_item *a;..  as
a820: 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
a830: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
a840: 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
a850: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
a860: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a870: 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70  nCol==pSelect->p
a880: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20  EList->nExpr || 
a890: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a8a0: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
a8b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
a8c0: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  urn;.  memset(&s
a8d0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
a8e0: 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  C));.  sNC.pSrcL
a8f0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
a900: 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65  Src;.  a = pSele
a910: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  ct->pEList->a;. 
a920: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
a930: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  Col; i<nCol; i++
a940: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
a950: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
a960: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
a970: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
a980: 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28  (db, columnType(
a990: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
a9a0: 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  ));.    pCol->af
a9b0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
a9c0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
a9d0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
a9e0: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
a9f0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
aa00: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
aa10: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
aa20: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
aa30: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
aa40: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
aa50: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
aa60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
aa70: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  b, pColl->zName)
aa80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
aa90: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
aaa0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
aab0: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
aac0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
aad0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
aae0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
aaf0: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
ab00: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
ab10: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
ab20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
ab30: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
ab40: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
ab50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ab60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
ab70: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
ab80: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
ab90: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
aba0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
abb0: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
abc0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
abd0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
abe0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
abf0: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
ac00: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
ac10: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
ac20: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
ac30: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
ac40: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
ac50: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
ac60: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
ac70: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
ac80: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ac90: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
aca0: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
acb0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
acc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
acd0: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  /* The sqlite3Re
ace0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
acf0: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e  ) is only used n
ad00: 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20   contexts where 
ad10: 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69  lookaside.  ** i
ad20: 73 20 64 69 73 61 62 6c 65 64 2c 20 73 6f 20 77  s disabled, so w
ad30: 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20  e might as well 
ad40: 68 61 72 64 2d 63 6f 64 65 20 70 54 61 62 2d 3e  hard-code pTab->
ad50: 64 62 4d 65 6d 20 74 6f 20 4e 55 4c 4c 2e 20 2a  dbMem to NULL. *
ad60: 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
ad70: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
ad80: 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62 2d  ed==0 );.  pTab-
ad90: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
ada0: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
adb0: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
adc0: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
add0: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  , pSelect->pELis
ade0: 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
adf0: 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
ae00: 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
ae10: 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
ae20: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43  pParse, pTab->nC
ae30: 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20  ol, pTab->aCol, 
ae40: 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
ae50: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
ae60: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
ae70: 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
ae80: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
ae90: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
aea0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
aeb0: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
aec0: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
aed0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
aee0: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
aef0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
af00: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
af10: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
af20: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
af30: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
af40: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
af50: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
af60: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
af70: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
af80: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
af90: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
afa0: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
afb0: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
afc0: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
afd0: 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53  ->db);.#ifndef S
afe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
aff0: 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20  .    if( v ){.  
b000: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b010: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63  ddOp0(v, OP_Trac
b020: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
b030: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
b040: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
b050: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
b060: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
b070: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
b080: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
b090: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
b0a0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
b0b0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
b0c0: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
b0d0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
b0e0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
b0f0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
b100: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
b110: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
b120: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
b130: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
b140: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
b150: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
b160: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
b170: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
b180: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
b190: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
b1a0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
b1b0: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
b1c0: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
b1d0: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
b1e0: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
b1f0: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
b200: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
b210: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
b220: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
b230: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
b240: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
b250: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
b260: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
b270: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
b280: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
b290: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
b2a0: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
b2b0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
b2c0: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
b2d0: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
b2e0: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
b2f0: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
b300: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
b310: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
b320: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
b330: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
b340: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
b350: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
b360: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
b370: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
b380: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
b390: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
b3a0: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
b3b0: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
b3c0: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
b3d0: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
b3e0: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
b3f0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
b400: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
b410: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
b420: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
b430: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
b440: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
b450: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
b460: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
b470: 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72  fset;.  int addr
b480: 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69  1, n;.  if( p->i
b490: 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a  Limit ) return;.
b4a0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d  .  /* .  ** "LIM
b4b0: 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68  IT -1" always sh
b4c0: 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54  ows all rows.  T
b4d0: 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a  here is some.  *
b4e0: 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62  * contraversy ab
b4f0: 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72  out what the cor
b500: 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68  rect behavior sh
b510: 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68  ould be..  ** Th
b520: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
b530: 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72  entation interpr
b540: 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f  ets "LIMIT 0" to
b550: 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f   mean.  ** no ro
b560: 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ws..  */.  sqlit
b570: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
b580: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
b590: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
b5a0: 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d  0 || p->pLimit!=
b5b0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  0 );.  if( p->pL
b5c0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
b5d0: 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
b5e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
b5f0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
b600: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
b610: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76  .    if( NEVER(v
b620: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
b630: 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c 64 20 68  /* VDBE should h
b640: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
b650: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
b660: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
b670: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
b680: 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20  imit, &n) ){.   
b690: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b6a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
b6b0: 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a  er, n, iLimit);.
b6c0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
b6d0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
b6e0: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69  nter"));.      i
b6f0: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
b700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b710: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
b720: 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   0, iBreak);.   
b730: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
b740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b750: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
b760: 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29  >pLimit, iLimit)
b770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b780: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b790: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69  MustBeInt, iLimi
b7a0: 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
b7b0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
b7c0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
b7d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b7e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp2(v, OP_IfZer
b7f0: 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  o, iLimit, iBrea
b800: 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  k);.    }.    if
b810: 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
b820: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
b830: 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70   = iOffset = ++p
b840: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
b850: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b     pParse->nMem+
b860: 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  +;   /* Allocate
b870: 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73 74   an extra regist
b880: 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66  er for limit+off
b890: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  set */.      sql
b8a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
b8b0: 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  rse, p->pOffset,
b8c0: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
b8d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b8e0: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
b8f0: 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  nt, iOffset);.  
b900: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
b910: 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e  (v, "OFFSET coun
b920: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64  ter"));.      ad
b930: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
b940: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
b950: 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  Pos, iOffset);. 
b960: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b970: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
b980: 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74  eger, 0, iOffset
b990: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b9a0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b9b0: 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71  addr1);.      sq
b9c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b9d0: 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69  v, OP_Add, iLimi
b9e0: 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66  t, iOffset, iOff
b9f0: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64  set+1);.      Vd
ba00: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
ba10: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
ba20: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
ba30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ba40: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69  v, OP_IfPos, iLi
ba50: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
ba60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ba70: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c   OP_Integer, -1,
ba80: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
ba90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
baa0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
bab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
bac0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bad0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
bae0: 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
baf0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
bb00: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
bb10: 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
bb20: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
bb30: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
bb40: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
bb50: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
bb60: 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
bb70: 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
bb80: 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
bb90: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
bba0: 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
bbb0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
bbc0: 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
bbd0: 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
bbe0: 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
bbf0: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
bc00: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
bc10: 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
bc20: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
bc30: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
bc40: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
bc50: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
bc60: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
bc70: 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
bc80: 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
bc90: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
bca0: 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
bcb0: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
bcc0: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
bcd0: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
bce0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
bcf0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
bd00: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   );.  if( pRet==
bd10: 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c  0 && iCol<p->pEL
bd20: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
bd30: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
bd40: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
bd50: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
bd60: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
bd70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
bd80: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
bd90: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
bda0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
bdb0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
bdc0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
bdd0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
bde0: 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
bdf0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
be00: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
be10: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
be20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
be30: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
be40: 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
be50: 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
be60: 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
be70: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
be80: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
be90: 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20  */.);...#ifndef 
bea0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
beb0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
bec0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
bed0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
bee0: 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
bef0: 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
bf00: 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
bf10: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
bf20: 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
bf30: 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
bf40: 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
bf50: 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
bf60: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
bf70: 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
bf80: 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
bf90: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
bfa0: 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
bfb0: 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
bfc0: 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
bfd0: 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
bfe0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
bff0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
c000: 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
c010: 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
c020: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
c030: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
c040: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
c050: 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
c060: 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
c070: 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
c080: 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
c090: 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
c0a0: 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
c0b0: 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
c0c0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
c0d0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
c0e0: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
c0f0: 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
c100: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
c110: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
c120: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
c130: 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
c140: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
c150: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
c160: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
c170: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
c180: 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
c190: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
c1b0: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
c1c0: 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
c1d0: 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
c1e0: 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
c1f0: 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
c200: 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
c210: 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
c220: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c230: 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
c240: 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
c250: 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
c260: 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
c270: 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
c280: 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
c290: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
c2a0: 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
c2b0: 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
c2c0: 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
c2d0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
c2e0: 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
c2f0: 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
c300: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
c310: 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
c320: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
c330: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
c340: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
c350: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
c360: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
c370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c380: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
c390: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
c3a0: 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
c3b0: 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
c3c0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
c3d0: 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
c3e0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
c3f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
c400: 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
c410: 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
c420: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
c430: 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
c440: 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
c450: 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
c460: 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
c470: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
c480: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
c490: 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
c4a0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
c4b0: 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
c4c0: 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
c4d0: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
c4e0: 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
c4f0: 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
c500: 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
c510: 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73  to delete */.  s
c520: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
c530: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
c540: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
c550: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
c560: 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
c570: 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
c580: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
c590: 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
c5a0: 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
c5b0: 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
c5c0: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
c5d0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
c5e0: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
c5f0: 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
c600: 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20  ->pPrior );  /* 
c610: 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  Calling function
c620: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73   guarantees this
c630: 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20 3d 20   much */.  db = 
c640: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
c650: 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
c660: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
c670: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d  or->pRightmost!=
c680: 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65  pPrior );.  asse
c690: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
c6a0: 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68  htmost==p->pRigh
c6b0: 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73 74 20  tmost );.  dest 
c6c0: 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
c6d0: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
c6e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
c6f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
c700: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
c710: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
c720: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
c730: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
c740: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
c750: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
c760: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c770: 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
c780: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b  Prior->pLimit ){
c790: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c7a0: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d  rMsg(pParse,"LIM
c7b0: 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  IT clause should
c7c0: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
c7d0: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
c7e0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
c7f0: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
c800: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
c810: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c820: 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   }..  v = sqlite
c830: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c840: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
c850: 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45   );  /* The VDBE
c860: 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64   already created
c870: 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63   by calling func
c880: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72  tion */..  /* Cr
c890: 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
c8a0: 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
c8b0: 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
c8c0: 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  y.  */.  if( des
c8d0: 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  t.eDest==SRT_Eph
c8e0: 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  emTab ){.    ass
c8f0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
c900: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c910: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
c920: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73  enEphemeral, des
c930: 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  t.iParm, p->pELi
c940: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
c950: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
c960: 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
c970: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
c980: 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
c990: 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
c9a0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
c9b0: 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
c9c0: 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
c9d0: 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
c9e0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
c9f0: 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
ca00: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
ca10: 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
ca20: 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
ca30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ca40: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ca50: 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
ca60: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
ca70: 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
ca80: 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
ca90: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
caa0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
cab0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
cac0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
cad0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
cae0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
caf0: 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
cb00: 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
cb10: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
cb20: 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
cb30: 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
cb40: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
cb50: 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
cb60: 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
cb70: 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
cb80: 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
cb90: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
cba0: 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
cbb0: 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
cbc0: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
cbd0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
cbe0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
cbf0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
cc00: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  r = 0;.      ass
cc10: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c  ert( !pPrior->pL
cc20: 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50  imit );.      pP
cc30: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
cc40: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
cc50: 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
cc60: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
cc70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cc80: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
cc90: 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20  Prior, &dest);. 
cca0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
ccb0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66   0;.      p->pOf
ccc0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
ccd0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
cce0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
ccf0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
cd00: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
cd10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
cd20: 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
cd30: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  iLimit;.      p-
cd40: 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
cd50: 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
cd60: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
cd70: 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  ){.        addr 
cd80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cd90: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op1(v, OP_IfZero
cda0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20  , p->iLimit);.  
cdb0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
cdc0: 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61  t((v, "Jump ahea
cdd0: 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
cde0: 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ed"));.      }. 
cdf0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ce00: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
ce10: 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  p, &dest);.     
ce20: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
ce30: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
ce40: 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
ce50: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
ce60: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
ce70: 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20  .      if( addr 
ce80: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ce90: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
cea0: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d  , addr);.      }
ceb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cec0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ced0: 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65  EXCEPT:.    case
cee0: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
cef0: 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
cf00: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
cf10: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
cf20: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64  orary table hold
cf30: 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ing result */.  
cf40: 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20      u8 op = 0;  
cf50: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
cf60: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
cf70: 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
cf80: 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  elf */.      int
cf90: 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
cfa0: 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
cfb0: 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
cfc0: 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
cfd0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
cfe0: 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f  mit, *pOffset; /
cff0: 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f  * Saved values o
d000: 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20  f p->nLimit and 
d010: 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20  p->nOffset */.  
d020: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
d030: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75      SelectDest u
d040: 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20  niondest;..     
d050: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
d060: 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20  ==TK_EXCEPT );. 
d070: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d080: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
d090: 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20  ;.      priorOp 
d0a0: 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
d0b0: 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
d0c0: 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 41 4c  t==priorOp && AL
d0d0: 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20  WAYS(!p->pLimit 
d0e0: 26 26 21 70 2d 3e 70 4f 66 66 73 65 74 29 20 29  &&!p->pOffset) )
d0f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
d100: 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
d110: 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
d120: 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
d130: 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
d140: 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
d150: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
d160: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d  sert( p->pRightm
d170: 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61  ost!=p );  /* Ca
d180: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f  n only happen fo
d190: 72 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  r leftward eleme
d1a0: 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  nts.            
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61           ** of a
d1d0: 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20 63   3-way or more c
d1e0: 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  ompound */.     
d1f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
d200: 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  imit==0 );      
d210: 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
d220: 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
d230: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
d240: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
d250: 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e  t==0 );     /* N
d260: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
d270: 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
d280: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
d290: 54 61 62 20 3d 20 64 65 73 74 2e 69 50 61 72 6d  Tab = dest.iParm
d2a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d2b0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
d2c0: 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
d2d0: 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
d2e0: 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
d2f0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
d300: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
d310: 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
d320: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
d330: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
d340: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
d350: 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
d360: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64  =0 );.        ad
d370: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
d380: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
d390: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
d3a0: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
d3b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
d3c0: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
d3d0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
d3e0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
d3f0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
d400: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
d410: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
d420: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
d430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d440: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
d450: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
d460: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
d470: 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
d480: 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
d490: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
d4a0: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
d4b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
d4c0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
d4d0: 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
d4e0: 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
d4f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
d500: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
d510: 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
d520: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d530: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
d540: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d550: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d560: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
d570: 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
d580: 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
d590: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
d5a0: 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
d5b0: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
d5c0: 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
d5d0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
d5e0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
d5f0: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
d600: 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
d610: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
d620: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
d630: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
d640: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
d650: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
d660: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
d670: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
d680: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
d690: 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
d6a0: 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 72 63 20   = op;.      rc 
d6b0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
d6c0: 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
d6d0: 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
d6e0: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
d6f0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
d700: 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
d710: 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
d720: 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
d730: 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
d740: 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
d750: 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
d760: 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
d770: 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
d780: 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
d790: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
d7a0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
d7b0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
d7c0: 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
d7d0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
d7e0: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
d7f0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
d800: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  By = 0;.      sq
d810: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d820: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
d830: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
d840: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
d850: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
d860: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
d870: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
d880: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
d890: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
d8a0: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
d8b0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
d8c0: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
d8d0: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
d8e0: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
d8f0: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
d900: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
d910: 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65  rt( unionTab==de
d920: 73 74 2e 69 50 61 72 6d 20 7c 7c 20 64 65 73 74  st.iParm || dest
d930: 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
d940: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
d950: 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
d960: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
d970: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
d980: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
d990: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
d9a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
d9b0: 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
d9c0: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
d9d0: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
d9e0: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
d9f0: 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
da00: 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
da10: 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
da20: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
da30: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
da40: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
da50: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
da60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
da70: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
da80: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
da90: 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
daa0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
dab0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
dac0: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
dad0: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
dae0: 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
daf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
db00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
db10: 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
db20: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
db30: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
db40: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
db50: 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
db60: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
db70: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
db80: 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
db90: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73       0, -1, &des
dbc0: 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
dbd0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
dbe0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
dbf0: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
dc00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dc10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
dc20: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
dc30: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
dc40: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
dc50: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
dc60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
dc70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dc80: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
dc90: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
dca0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dcb0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
dcc0: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
dcd0: 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b  K_INTERSECT ); {
dce0: 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
dcf0: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
dd00: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
dd10: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
dd20: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
dd30: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
dd40: 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
dd50: 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
dd60: 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
dd70: 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  r1;..      /* IN
dd80: 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
dd90: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
dda0: 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
ddb0: 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
ddc0: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
ddd0: 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
dde0: 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
ddf0: 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
de00: 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
de10: 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
de20: 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
de30: 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
de40: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
de50: 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
de60: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
de70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
de80: 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  derBy==0 );..   
de90: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
dea0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
deb0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
dec0: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
ded0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
dee0: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
def0: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
df00: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
df10: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
df20: 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c  Rightmost->selFl
df30: 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
df40: 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
df50: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
df60: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
df70: 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
df80: 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
df90: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
dfa0: 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
dfb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
dfc0: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
dfd0: 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
dfe0: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
dff0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e000: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
e010: 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65  pPrior, &interse
e020: 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ctdest);.      i
e030: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
e040: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
e050: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
e060: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
e070: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
e080: 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
e090: 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
e0a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
e0b0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
e0c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
e0d0: 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c  Ephemeral, tab2,
e0e0: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
e0f0: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
e100: 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[1] == -1 );. 
e110: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
e120: 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[1] = addr;.
e130: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
e140: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
e150: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
e160: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
e170: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
e180: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
e190: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
e1a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65   = 0;.      inte
e1b0: 72 73 65 63 74 64 65 73 74 2e 69 50 61 72 6d 20  rsectdest.iParm 
e1c0: 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 72 63  = tab2;.      rc
e1d0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
e1e0: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
e1f0: 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
e200: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
e210: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
e220: 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
e230: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
e240: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
e250: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
e260: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
e270: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
e280: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
e290: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
e2a0: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
e2b0: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
e2c0: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
e2d0: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
e2e0: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
e2f0: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
e300: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
e310: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e320: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
e330: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
e340: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
e350: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
e360: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
e370: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
e380: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
e390: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
e3a0: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  ior;.        gen
e3b0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
e3c0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
e3d0: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
e3e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
e3f0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
e400: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
e410: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
e420: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
e430: 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
e440: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
e450: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
e460: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
e470: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e480: 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
e490: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72  iBreak);.      r
e4a0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
e4b0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
e4c0: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
e4d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e4e0: 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
e4f0: 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
e500: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
e510: 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
e520: 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
e530: 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73   r1, 0);.      s
e540: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
e550: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
e560: 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
e570: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
e580: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
e590: 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
e5a0: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d              0, -
e5c0: 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  1, &dest, iCont,
e5d0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
e5e0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e5f0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
e600: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e610: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e620: 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
e630: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
e640: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
e650: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
e660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e670: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
e680: 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
e690: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e6a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
e6b0: 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
e6c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e6d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
e6e0: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
e6f0: 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a  uences used by .
e700: 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
e710: 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
e720: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
e730: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
e740: 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
e750: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
e760: 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
e770: 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  y tables..  **. 
e780: 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
e790: 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
e7a0: 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
e7b0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
e7c0: 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
e7d0: 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
e7e0: 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
e7f0: 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
e800: 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
e810: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
e820: 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
e830: 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
e840: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
e850: 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
e860: 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
e870: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
e880: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
e890: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  UsesEphemeral ){
e8a0: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8c0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e8d0: 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
e8e0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
e8f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
e900: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
e910: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
e920: 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
e930: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
e940: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
e950: 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
e960: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
e970: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
e980: 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  apColl;         
e990: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
e9a0: 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49  ng through pKeyI
e9b0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
e9c0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
e9f0: 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
ea00: 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73   set */..    ass
ea10: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
ea20: 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f  st==p );.    nCo
ea30: 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
ea40: 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
ea50: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
ea60: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20  llocZero(db,.   
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79      sizeof(*pKey
ea90: 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65  Info)+nCol*(size
eaa0: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31  of(CollSeq*) + 1
eab0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  ));.    if( !pKe
eac0: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
ead0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
eae0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
eaf0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
eb00: 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e     }..    pKeyIn
eb10: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
eb20: 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  );.    pKeyInfo-
eb30: 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e  >nField = (u16)n
eb40: 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  Col;..    for(i=
eb50: 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
eb60: 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
eb70: 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
eb80: 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
eb90: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
eba0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
ebb0: 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
ebc0: 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
ebd0: 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64       *apColl = d
ebe0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
ebf0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
ec00: 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
ec10: 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
ec20: 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
ec30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
ec40: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
ec50: 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
ec60: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
ec70: 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
ec80: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
ec90: 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
eca0: 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
ecb0: 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
ecc0: 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
ecd0: 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
ece0: 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
ecf0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
ed00: 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
ed10: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
ed20: 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
ed30: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
ed40: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
ed50: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
ed60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ed70: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
ed80: 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
ed90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
eda0: 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
edb0: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
edc0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
edd0: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
ede0: 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
edf0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
ee00: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
ee10: 65 65 28 64 62 2c 20 70 4b 65 79 49 6e 66 6f 29  ee(db, pKeyInfo)
ee20: 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
ee30: 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74  ect_end:.  pDest
ee40: 2d 3e 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d  ->iMem = dest.iM
ee50: 65 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d 65  em;.  pDest->nMe
ee60: 6d 20 3d 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20  m = dest.nMem;. 
ee70: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
ee80: 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65  lete(db, pDelete
ee90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
eea0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
eeb0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
eec0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
eed0: 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
eee0: 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
eef0: 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
ef00: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
ef10: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
ef20: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
ef30: 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
ef40: 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
ef50: 70 49 6e 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 72  pIn->iMem.  Ther
ef60: 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 4d  e are.** pIn->nM
ef70: 65 6d 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  em columns to be
ef80: 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20   output.  pDest 
ef90: 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74  is where the out
efa0: 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  put should.** be
efb0: 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67   sent..**.** reg
efc0: 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75  Return is the nu
efd0: 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69  mber of the regi
efe0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
eff0: 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72   subroutine.** r
f000: 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a  eturn address..*
f010: 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e  *.** If regPrev>
f020: 30 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 74  0 then it is a t
f030: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
f040: 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
f050: 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
f060: 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
f070: 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
f080: 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
f090: 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
f0a0: 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
f0b0: 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
f0c0: 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
f0d0: 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
f0e0: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
f0f0: 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
f100: 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
f110: 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
f120: 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
f130: 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
f140: 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
f150: 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
f160: 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
f170: 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
f180: 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
f190: 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
f1a0: 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
f1b0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
f1c0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
f1d0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f1f0: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
f200: 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
f210: 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
f220: 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
f230: 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
f240: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
f250: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
f260: 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
f270: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
f280: 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
f290: 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
f2a0: 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
f2b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
f2c0: 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
f2d0: 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
f2e0: 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
f2f0: 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
f300: 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
f310: 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
f320: 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
f330: 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
f340: 79 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  y */.  int p4typ
f350: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
f360: 2a 20 54 68 65 20 70 34 20 74 79 70 65 20 66 6f  * The p4 type fo
f370: 72 20 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20  r pKeyInfo */.  
f380: 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
f390: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
f3a0: 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
f3b0: 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
f3c0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
f3d0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
f3e0: 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
f3f0: 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
f400: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
f410: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
f420: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
f430: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
f440: 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
f450: 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
f460: 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
f470: 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
f480: 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
f490: 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c  v ){.    int j1,
f4a0: 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71   j2;.    j1 = sq
f4b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f4c0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
f4d0: 50 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20  Prev);.    j2 = 
f4e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f4f0: 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
f500: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50   pIn->iMem, regP
f510: 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  rev+1, pIn->nMem
f520: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
f550: 20 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71   p4type);.    sq
f560: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f570: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32  v, OP_Jump, j2+2
f580: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b  , iContinue, j2+
f590: 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
f5a0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
f5b0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  1);.    sqlite3E
f5c0: 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72  xprCodeCopy(pPar
f5d0: 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72  se, pIn->iMem, r
f5e0: 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
f5f0: 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Mem);.    sqlite
f600: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f610: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
f620: 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66  gPrev);.  }.  if
f630: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
f640: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
f650: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70  urn 0;..  /* Sup
f660: 70 72 65 73 73 20 74 68 65 20 74 68 65 20 66 69  press the the fi
f670: 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
f680: 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
f690: 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
f6a0: 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
f6b0: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
f6c0: 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  e);..  switch( p
f6d0: 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20  Dest->eDest ){. 
f6e0: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
f6f0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
f700: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
f710: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
f720: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
f730: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
f740: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
f750: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
f760: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
f770: 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20  .      int r2 = 
f780: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
f790: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
f7a0: 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74   testcase( pDest
f7b0: 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ->eDest==SRT_Tab
f7c0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
f7d0: 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65  case( pDest->eDe
f7e0: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
f7f0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
f800: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f810: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
f820: 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d  n->iMem, pIn->nM
f830: 65 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  em, r1);.      s
f840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f850: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
f860: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72   pDest->iParm, r
f870: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
f880: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f890: 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
f8a0: 3e 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b  >iParm, r1, r2);
f8b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f8c0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
f8d0: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
f8e0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
f8f0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
f900: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
f910: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
f920: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
f930: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f940: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
f950: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
f960: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
f970: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
f980: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
f990: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
f9a0: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
f9b0: 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
f9c0: 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
f9d0: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
f9e0: 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
f9f0: 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
fa00: 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
fa10: 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
fa20: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
fa30: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
fa40: 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73  nt r1;.      ass
fa50: 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d  ert( pIn->nMem==
fa60: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66  1 );.      p->af
fa70: 66 69 6e 69 74 79 20 3d 20 0a 20 20 20 20 20 20  finity = .      
fa80: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
fa90: 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  eAffinity(p->pEL
faa0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
fab0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
fac0: 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
fad0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
fae0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
faf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
fb00: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
fb10: 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c  d, pIn->iMem, 1,
fb20: 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74   r1, &p->affinit
fb30: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  y, 1);.      sql
fb40: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
fb50: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
fb60: 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31  se, pIn->iMem, 1
fb70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fb80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fb90: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73  _IdxInsert, pDes
fba0: 74 2d 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t->iParm, r1);. 
fbb0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
fbc0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
fbd0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
fbe0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
fbf0: 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75  0  /* Never occu
fc00: 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42  rs on an ORDER B
fc10: 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f  Y query */.    /
fc20: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
fc30: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
fc40: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
fc50: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
fc60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
fc70: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
fc80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fc90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
fca0: 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d  teger, 1, pDest-
fcb0: 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f  >iParm);.      /
fcc0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
fcd0: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
fce0: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
fcf0: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
fd00: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
fd10: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
fd20: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
fd30: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
fd40: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
fd50: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
fd60: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
fd70: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
fd80: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
fd90: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
fda0: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
fdb0: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
fdc0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
fdd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
fde0: 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20  n->nMem==1 );.  
fdf0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
fe00: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
fe10: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74  pIn->iMem, pDest
fe20: 2d 3e 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  ->iParm, 1);.   
fe30: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
fe40: 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
fe50: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
fe60: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
fe70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
fe80: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
fe90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
fea0: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
feb0: 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
fec0: 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
fed0: 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
fee0: 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
fef0: 67 20 61 74 20 70 44 65 73 74 2d 3e 69 4d 65 6d  g at pDest->iMem
ff00: 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72  .  Then the co-r
ff10: 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20  outine yields.. 
ff20: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
ff30: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
ff40: 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d        if( pDest-
ff50: 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >iMem==0 ){.    
ff60: 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20      pDest->iMem 
ff70: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
ff80: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  Range(pParse, pI
ff90: 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  n->nMem);.      
ffa0: 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20    pDest->nMem = 
ffb0: 70 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  pIn->nMem;.     
ffc0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
ffd0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
ffe0: 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
fff0: 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 70 44 65  pDest->iMem, pDe
10000 73 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  st->nMem);.     
10010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10020 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
10030 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20  pDest->iParm);. 
10040 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10050 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  }..    /* If non
10060 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20  e of the above, 
10070 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
10080 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74  destination must
10090 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f   be.    ** SRT_O
100a0 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75  utput.  This rou
100b0 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
100c0 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74  lled with any ot
100d0 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69  her.    ** desti
100e0 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nation other tha
100f0 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c  n the ones handl
10100 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f  ed above or SRT_
10110 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20  Output..    **. 
10120 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75     ** For SRT_Ou
10130 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72  tput, results ar
10140 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
10150 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
10160 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68  ers.  .    ** Th
10170 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  en the OP_Result
10180 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73  Row opcode is us
10190 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69  ed to cause sqli
101a0 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20  te3_step() to.  
101b0 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
101c0 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75  next row of resu
101d0 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  lt..    */.    d
101e0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
101f0 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
10200 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
10210 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
10220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10230 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e  P_ResultRow, pIn
10240 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65  ->iMem, pIn->nMe
10250 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
10260 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
10270 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
10280 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d   pIn->iMem, pIn-
10290 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72  >nMem);.      br
102a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
102b0 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
102c0 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
102d0 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
102e0 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
102f0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
10300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
10310 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
10320 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
10330 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20   iBreak, -1);.  
10340 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
10350 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
10360 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
10370 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
10380 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
10390 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
103a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
103b0 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
103c0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
103d0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
103e0 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
103f0 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
10400 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
10410 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
10420 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
10430 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
10440 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
10450 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
10460 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
10470 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
10480 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
10490 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
104a0 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
104b0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
104c0 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
104d0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
104e0 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
104f0 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
10500 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
10510 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
10520 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
10530 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
10540 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
10550 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
10560 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
10570 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
10580 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
10590 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
105a0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
105b0 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
105c0 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
105d0 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
105e0 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
105f0 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
10600 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
10610 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
10620 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
10630 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
10640 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
10650 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
10660 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
10670 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
10680 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
10690 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
106a0 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
106b0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
106c0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
106d0 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
106e0 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
106f0 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
10700 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
10710 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
10720 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
10730 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
10740 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
10750 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
10760 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
10770 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
10780 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
10790 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
107a0 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
107b0 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
107c0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
107d0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
107e0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
107f0 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
10800 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
10810 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
10820 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
10830 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
10840 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
10850 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
10860 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
10870 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
10880 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
10890 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
108a0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
108b0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
108c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
108d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
108e0 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
108f0 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
10900 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
10910 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
10920 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
10930 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
10940 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
10950 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
10960 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
10970 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
10980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
10990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
109a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
109b0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
109c0 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
109d0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
109e0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
109f0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
10a00 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
10a10 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
10a20 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
10a30 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
10a40 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
10a50 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
10a60 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
10a70 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
10a80 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
10a90 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
10aa0 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
10ab0 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
10ac0 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
10ad0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
10ae0 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
10af0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
10b00 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
10b10 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
10b20 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
10b30 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
10b40 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
10b50 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
10b60 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
10b70 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
10b80 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
10b90 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
10ba0 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
10bb0 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
10bc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
10bd0 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
10be0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
10bf0 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
10c00 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
10c10 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
10c20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
10c30 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
10c40 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
10c50 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
10c60 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
10c70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
10c80 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
10c90 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
10ca0 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
10cb0 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
10cc0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
10cd0 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
10ce0 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
10cf0 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
10d00 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
10d10 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
10d20 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
10d30 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
10d40 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
10d50 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
10d60 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
10d70 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
10d80 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
10d90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
10da0 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
10db0 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
10dc0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
10dd0 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
10de0 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
10df0 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
10e00 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
10e10 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
10e20 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
10e30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
10e40 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
10e50 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
10e60 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
10e70 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
10e80 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
10e90 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
10ea0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
10eb0 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
10ec0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
10ed0 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
10ee0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
10ef0 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
10f00 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
10f10 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
10f20 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
10f30 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
10f40 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
10f50 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
10f60 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
10f70 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
10f80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
10f90 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
10fa0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
10fb0 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
10fc0 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
10fd0 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
10fe0 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
10ff0 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
11000 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
11010 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
11020 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
11030 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
11040 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
11050 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
11060 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
11070 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
11080 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
11090 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
110a0 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
110b0 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
110c0 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
110d0 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
110e0 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
110f0 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
11100 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
11110 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
11120 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
11130 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
11140 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11150 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
11160 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
11170 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
11180 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
11190 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
111a0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
111b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
111c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
111d0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
111e0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
111f0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
11200 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
11210 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
11220 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
11230 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
11240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11250 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
11260 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
11270 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
11280 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
11290 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
112a0 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
112d0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
112e0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
112f0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
11300 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
11310 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
11320 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
11330 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
11340 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
11350 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
11360 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
11370 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
11380 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
11390 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
113a0 67 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20  gEofA;          
113b0 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63  /* Flag to indic
113c0 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d  ate when select-
113d0 41 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f  A is complete */
113e0 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
113f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
11400 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
11410 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
11420 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
11430 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f  EofB;          /
11440 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61  * Flag to indica
11450 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42  te when select-B
11460 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a   is complete */.
11470 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
11480 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
11490 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
114a0 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
114b0 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
114c0 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
114d0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
114e0 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
114f0 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
11500 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
11510 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
11520 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
11530 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
11540 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
11550 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
11560 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
11570 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
11580 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
11590 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
115a0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
115b0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
115c0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
115d0 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f  rOutB = 0;     /
115e0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
115f0 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
11600 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
11610 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
11620 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
11630 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
11640 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
11650 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
11660 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
11670 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
11680 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20  ect-B-exhausted 
11690 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
116a0 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20  int addrAltB;   
116b0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
116c0 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72   of the A<B subr
116d0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
116e0 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20  addrAeqB;       
116f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
11700 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74  the A==B subrout
11710 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
11720 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAgtB;         /
11730 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
11740 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A>B subroutine 
11750 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
11760 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tA;        /* Li
11770 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
11780 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
11790 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20  nt regLimitB;   
117a0 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
117b0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
117c0 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
117d0 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  Prev;          /
117e0 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67  * A range of reg
117f0 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70  isters to hold p
11800 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a  revious output *
11810 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d  /.  int savedLim
11820 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  it;       /* Sav
11830 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
11840 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73  Limit */.  int s
11850 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20  avedOffset;     
11860 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
11870 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f  of p->iOffset */
11880 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72  .  int labelCmpr
11890 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65  ;        /* Labe
118a0 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  l for the start 
118b0 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67  of the merge alg
118c0 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20  orithm */.  int 
118d0 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20  labelEnd;       
118e0 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
118f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76  he end of the ov
11900 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d  erall SELECT stm
11910 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20  t */.  int j1;  
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11930 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  Jump instruction
11940 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72  s that get retar
11950 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  getted */.  int 
11960 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
11970 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41    /* One of TK_A
11980 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b  LL, TK_UNION, TK
11990 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45  _EXCEPT, TK_INTE
119a0 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e  RSECT */.  KeyIn
119b0 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b  fo *pKeyDup = 0;
119c0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
119d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64  nformation for d
119e0 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
119f0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
11a00 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43  KeyMerge;   /* C
11a10 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
11a20 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e  ation for mergin
11a30 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69  g rows */.  sqli
11a40 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
11a50 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
11a60 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
11a70 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
11a80 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
11a90 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
11aa0 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
11ab0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11ac0 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
11ad0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11ae0 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75  */.  int *aPermu
11af0 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  te;        /* Ma
11b00 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52  pping from ORDER
11b10 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73   BY terms to res
11b20 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20  ult set columns 
11b30 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
11b40 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a  >pOrderBy!=0 );.
11b50 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75    assert( pKeyDu
11b60 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61  p==0 ); /* "Mana
11b70 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20  ged" code needs 
11b80 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33  this.  Ticket #3
11b90 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  382. */.  db = p
11ba0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
11bb0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
11bc0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
11bd0 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61  ;       /* Alrea
11be0 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72  dy thrown the er
11bf0 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f  ror if VDBE allo
11c00 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61  c failed */.  la
11c10 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  belEnd = sqlite3
11c20 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11c30 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20  ;.  labelCmpr = 
11c40 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11c50 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20  abel(v);...  /* 
11c60 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44  Patch up the ORD
11c70 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
11c80 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20  /.  op = p->op; 
11c90 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e   .  pPrior = p->
11ca0 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
11cb0 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
11cc0 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65  By==0 );.  pOrde
11cd0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
11ce0 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  y;.  assert( pOr
11cf0 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65  derBy );.  nOrde
11d00 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
11d10 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72  nExpr;..  /* For
11d20 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72   operators other
11d30 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
11d40 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  we have to make 
11d50 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74  sure that.  ** t
11d60 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11d70 73 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20  se covers every 
11d80 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75  term of the resu
11d90 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a  lt set.  Add.  *
11da0 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f  * terms to the O
11db0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
11dc0 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
11dd0 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41  /.  if( op!=TK_A
11de0 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  LL ){.    for(i=
11df0 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  1; db->mallocFai
11e00 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e  led==0 && i<=p->
11e10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
11e20 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
11e30 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11e40 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f  *pItem;.      fo
11e50 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(j=0, pItem=pOr
11e60 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64  derBy->a; j<nOrd
11e70 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  erBy; j++, pItem
11e80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
11e90 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c  ert( pItem->iCol
11ea0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
11eb0 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3d 3d 69  ( pItem->iCol==i
11ec0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
11ed0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
11ee0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
11ef0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
11f00 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
11f10 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
11f20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
11f30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
11f40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
11f50 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
11f60 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
11f70 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
11f80 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20  Value = i;.     
11f90 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71     pOrderBy = sq
11fa0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
11fb0 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64  end(pParse, pOrd
11fc0 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20  erBy, pNew);.   
11fd0 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
11fe0 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69 43 6f  [nOrderBy++].iCo
11ff0 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20  l = (u16)i;.    
12000 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12010 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
12020 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75  comparison permu
12030 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e  tation and keyin
12040 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20  fo that is used 
12050 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65  with.  ** the pe
12060 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74  rmutation used t
12070 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
12080 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77  he next.  ** row
12090 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65   of results come
120a0 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f  s from selectA o
120b0 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f  r selectB.  Also
120c0 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20   add explicit.  
120d0 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f  ** collations to
120e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
120f0 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68  ause terms so th
12100 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71  at when the subq
12110 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74  ueries.  ** to t
12120 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65  he right and the
12130 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61   left are evalua
12140 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68  ted, they use th
12150 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63  e correct.  ** c
12160 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ollation..  */. 
12170 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69   aPermute = sqli
12180 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
12190 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e  b, sizeof(int)*n
121a0 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
121b0 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
121c0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
121d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
121e0 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
121f0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e  pOrderBy->a; i<n
12200 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49  OrderBy; i++, pI
12210 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  tem++){.      as
12220 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f  sert( pItem->iCo
12230 6c 3e 30 20 20 26 26 20 70 49 74 65 6d 2d 3e 69  l>0  && pItem->i
12240 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
12250 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
12260 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
12270 65 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b 0a 20 20  em->iCol - 1;.  
12280 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67    }.    pKeyMerg
12290 65 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e =.      sqlite
122a0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
122b0 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d 65 72   sizeof(*pKeyMer
122c0 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28 73 69  ge)+nOrderBy*(si
122d0 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
122e0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  ));.    if( pKey
122f0 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 70  Merge ){.      p
12300 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f  KeyMerge->aSortO
12310 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65  rder = (u8*)&pKe
12320 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f  yMerge->aColl[nO
12330 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 20 20 70  rderBy];.      p
12340 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65 6c 64  KeyMerge->nField
12350 20 3d 20 28 75 31 36 29 6e 4f 72 64 65 72 42 79   = (u16)nOrderBy
12360 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  ;.      pKeyMerg
12370 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  e->enc = ENC(db)
12380 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
12390 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
123a0 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
123b0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
123c0 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d     Expr *pTerm =
123d0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
123e0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
123f0 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
12400 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
12410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
12420 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 43 6f 6c  ll = pTerm->pCol
12430 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  l;.        }else
12440 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
12450 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
12460 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
12470 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a  , aPermute[i]);.
12480 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
12490 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
124a0 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
124b0 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20     pTerm->pColl 
124c0 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  = pColl;.       
124d0 20 7d 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d   }.        pKeyM
124e0 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  erge->aColl[i] =
124f0 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pColl;.        
12500 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74  pKeyMerge->aSort
12510 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
12520 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
12530 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  der;.      }.   
12540 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
12550 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20  pKeyMerge = 0;. 
12560 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63   }..  /* Reattac
12570 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
12580 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65  lause to the que
12590 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ry..  */.  p->pO
125a0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
125b0 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72  y;.  pPrior->pOr
125c0 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
125d0 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
125e0 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c  e->db, pOrderBy,
125f0 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63   0);..  /* Alloc
12600 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74  ate a range of t
12610 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
12620 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e  rs and the KeyIn
12630 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66  fo needed.  ** f
12640 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  or the logic tha
12650 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63  t removes duplic
12660 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20  ate result rows 
12670 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70  when the.  ** op
12680 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c  erator is UNION,
12690 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
126a0 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55  RSECT (but not U
126b0 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a  NION ALL)..  */.
126c0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
126d0 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20   ){.    regPrev 
126e0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
126f0 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d    int nExpr = p-
12700 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
12710 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64      assert( nOrd
12720 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64  erBy>=nExpr || d
12730 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12740 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  );.    regPrev =
12750 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
12760 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
12770 70 72 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  pr+1);.    sqlit
12780 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12790 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
127a0 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65  egPrev);.    pKe
127b0 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 44 62  yDup = sqlite3Db
127c0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20  MallocZero(db,. 
127d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127e0 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 44 75 70   sizeof(*pKeyDup
127f0 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f  ) + nExpr*(sizeo
12800 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29  f(CollSeq*)+1) )
12810 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75  ;.    if( pKeyDu
12820 70 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 44  p ){.      pKeyD
12830 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  up->aSortOrder =
12840 20 28 75 38 2a 29 26 70 4b 65 79 44 75 70 2d 3e   (u8*)&pKeyDup->
12850 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20  aColl[nExpr];.  
12860 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 6e 46 69      pKeyDup->nFi
12870 65 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70 72  eld = (u16)nExpr
12880 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d  ;.      pKeyDup-
12890 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
128a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
128b0 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
128c0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
128d0 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
128e0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
128f0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
12900 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
12910 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
12920 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12930 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
12940 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
12950 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
12960 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
12970 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
12980 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e   = 0;.  pPrior->
12990 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
129a0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
129b0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
129c0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
129d0 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
129e0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
129f0 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
12a00 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
12a10 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
12a20 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
12a30 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
12a40 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
12a50 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
12a60 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
12a70 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
12a80 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
12a90 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
12aa0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
12ab0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
12ac0 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
12ad0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
12ae0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
12af0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
12b00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12b10 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
12b20 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
12b30 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
12b40 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b60 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
12b70 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
12b80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12b90 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
12ba0 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
12bb0 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
12bc0 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
12bd0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
12be0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
12bf0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
12c00 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
12c10 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
12c20 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
12c30 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
12c40 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
12c50 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12c60 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b  m;.  regEofA = +
12c70 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12c80 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50   regAddrB = ++pP
12c90 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
12ca0 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65  gEofB = ++pParse
12cb0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
12cc0 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
12cd0 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
12ce0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12cf0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
12d00 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
12d10 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
12d20 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
12d30 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
12d40 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
12d50 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
12d60 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70  B);..  /* Jump p
12d70 61 73 74 20 74 68 65 20 76 61 72 69 6f 75 73 20  ast the various 
12d80 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20  subroutines and 
12d90 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68  coroutines to th
12da0 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67  e main.  ** merg
12db0 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31  e loop.  */.  j1
12dc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12dd0 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
12de0 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  ;.  addrSelectA 
12df0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
12e00 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20  rentAddr(v);... 
12e10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
12e20 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
12e30 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
12e40 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
12e50 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
12e60 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
12e70 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
12e80 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
12e90 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
12ea0 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e   "Begin coroutin
12eb0 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43  e for left SELEC
12ec0 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
12ed0 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
12ee0 74 41 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  tA;.  sqlite3Sel
12ef0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
12f00 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73  or, &destA);.  s
12f10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12f20 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12f30 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73  1, regEofA);.  s
12f40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12f50 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
12f60 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e  gAddrA);.  VdbeN
12f70 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12f80 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  End coroutine fo
12f90 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29  r left SELECT"))
12fa0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
12fb0 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
12fc0 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
12fd0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
12fe0 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74   .  ** the right
12ff0 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63   - the "B" selec
13000 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  t.  */.  addrSel
13010 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  ectB = sqlite3Vd
13020 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
13030 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
13040 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63  ent((v, "Begin c
13050 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
13060 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ht SELECT"));.  
13070 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e  savedLimit = p->
13080 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f  iLimit;.  savedO
13090 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
130a0 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  et;.  p->iLimit 
130b0 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70  = regLimitB;.  p
130c0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20  ->iOffset = 0;  
130d0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
130e0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
130f0 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
13100 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
13110 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
13120 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
13130 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13140 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
13150 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c   regEofB);.  sql
13160 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13170 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
13180 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  ddrB);.  VdbeNoo
13190 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
131a0 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  d coroutine for 
131b0 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
131c0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
131d0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
131e0 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
131f0 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
13200 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
13210 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
13220 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
13230 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
13240 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
13250 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
13260 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
13270 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
13280 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
13290 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
132a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
132b0 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
132c0 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
132e0 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
132f0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
13300 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  FF, labelEnd);. 
13310 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   .  /* Generate 
13320 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
13330 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
13340 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
13350 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   B.  ** select a
13360 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
13370 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
13380 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
13390 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
133a0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
133b0 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ION ){.    VdbeN
133c0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
133d0 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
133e0 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64  or B"));.    add
133f0 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65  rOutB = generate
13400 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
13410 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
13420 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
13430 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
13440 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utB,.           
13450 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
13460 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e  KeyDup, P4_KEYIN
13470 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c  FO_STATIC, label
13480 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  End);.  }..  /* 
13490 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
134a0 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
134b0 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
134c0 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
134d0 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
134e0 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
134f0 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
13500 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
13510 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
13520 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
13530 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
13540 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
13550 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
13560 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
13570 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13580 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
13590 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  belEnd);.  }else
135a0 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41  {  .    addrEofA
135b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
135c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
135d0 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64  egEofB, labelEnd
135e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
135f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
13600 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
13610 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71  ddrOutB);.    sq
13620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13630 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
13640 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69  AddrB);.    sqli
13650 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13660 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
13670 72 45 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofA);.  }..  /
13680 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
13690 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
136a0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
136b0 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
136c0 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
136d0 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
136e0 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
136f0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
13700 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
13710 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
13720 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 7d 65  = addrEofA;.  }e
13730 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
13740 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
13750 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
13760 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
13770 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
13780 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
13790 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e  regEofA, labelEn
137a0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
137b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
137c0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
137d0 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
137e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
137f0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
13800 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c  gAddrA);.    sql
13810 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13820 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
13830 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20  drEofB);.  }..  
13840 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13850 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
13860 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a  ase of A<B.  */.
13870 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
13880 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75  t((v, "A-lt-B su
13890 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
138a0 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65  ddrAltB = sqlite
138b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
138c0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
138d0 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73  , addrOutA);.  s
138e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
138f0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
13900 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
13910 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13920 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
13930 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c  addrEofA);.  sql
13940 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13950 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
13960 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
13970 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
13980 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
13990 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
139a0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
139b0 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
139c0 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
139d0 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
139e0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
139f0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
13a00 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
13a10 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
13a20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
13a30 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
13a40 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
13a50 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
13a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13a70 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
13a80 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c  gAddrA);.    sql
13a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13aa0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
13ab0 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
13ac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13ad0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
13ae0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
13af0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
13b00 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
13b10 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
13b20 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
13b30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
13b40 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
13b50 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
13b60 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
13b70 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
13b80 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
13b90 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
13ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13bb0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
13bc0 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
13bd0 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
13be0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13bf0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
13c00 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rB);.  sqlite3Vd
13c10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13c20 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72  f, regEofB, addr
13c30 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
13c40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13c50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
13c60 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
13c70 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
13c80 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
13c90 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
13ca0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13cb0 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73  Here(v, j1);.  s
13cc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13cd0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13ce0 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73  0, regEofA);.  s
13cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13d00 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13d10 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73  0, regEofB);.  s
13d20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13d30 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
13d40 67 41 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65  gAddrA, addrSele
13d50 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ctA);.  sqlite3V
13d60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13d70 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c  Gosub, regAddrB,
13d80 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
13d90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13da0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
13db0 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  EofA, addrEofA);
13dc0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13dd0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
13de0 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42  egEofB, addrEofB
13df0 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
13e00 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
13e10 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
13e20 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
13e30 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
13e40 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
13e50 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
13e60 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
13e70 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
13e80 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
13e90 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
13ea0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
13eb0 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 4d 65  mpare, destA.iMe
13ec0 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20 6e  m, destB.iMem, n
13ed0 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ef0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72    (char*)pKeyMer
13f00 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ge, P4_KEYINFO_H
13f10 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74  ANDOFF);.  sqlit
13f20 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13f30 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74  OP_Jump, addrAlt
13f40 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64  B, addrAeqB, add
13f50 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65  rAgtB);..  /* Re
13f60 6c 65 61 73 65 20 74 65 6d 70 6f 72 61 72 79 20  lease temporary 
13f70 72 65 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20  registers.  */. 
13f80 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
13f90 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
13fa0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
13fb0 73 65 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f 72  se, regPrev, nOr
13fc0 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20  derBy+1);.  }.. 
13fd0 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
13fe0 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
13ff0 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  der to terminate
14000 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
14010 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
14020 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
14030 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53  belEnd);..  /* S
14040 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
14050 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a   output columns.
14060 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
14070 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
14080 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  put ){.    Selec
14090 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69  t *pFirst = pPri
140a0 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  or;.    while( p
140b0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
140c0 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
140d0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e  >pPrior;.    gen
140e0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
140f0 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
14100 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st->pEList);.  }
14110 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c  ..  /* Reassembl
14120 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  y the compound q
14130 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20  uery so that it 
14140 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f  will be freed co
14150 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  rrectly.  ** by 
14160 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
14170 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tion */.  if( p-
14180 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73  >pPrior ){.    s
14190 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
141a0 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  te(db, p->pPrior
141b0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
141c0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20  or = pPrior;..  
141d0 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
141e0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
141f0 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
14200 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
14210 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
14220 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65 74 75  ies ****/.  retu
14230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14240 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
14250 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14260 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
14270 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14280 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77  IT_VIEW)./* Forw
14290 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73  ard Declarations
142a0 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
142b0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71  substExprList(sq
142c0 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74  lite3*, ExprList
142d0 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
142e0 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
142f0 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69  substSelect(sqli
14300 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20  te3*, Select *, 
14310 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29  int, ExprList *)
14320 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  ;../*.** Scan th
14330 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
14340 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
14350 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
14360 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
14370 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
14380 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
14390 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
143a0 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
143b0 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
143c0 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
143d0 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
143e0 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
143f0 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
14400 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
14410 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
14420 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
14430 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
14440 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
14450 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
14460 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
14470 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
14480 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
14490 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
144a0 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
144b0 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
144c0 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
144d0 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
144e0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
144f0 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73   make the necess
14500 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  ary .** changes 
14510 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  to pExpr so that
14520 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63   it refers direc
14530 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63  tly to the sourc
14540 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68  e table.** of th
14550 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65  e subquery rathe
14560 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
14570 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
14580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
14590 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 73   *substExpr(.  s
145a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
145b0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
145c0 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68  loc errors to th
145d0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  is connection */
145e0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
145f0 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69         /* Expr i
14600 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75  n which substitu
14610 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20  tion occurs */. 
14620 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
14630 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
14640 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
14650 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
14660 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73  EList    /* Subs
14670 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f  titute expressio
14680 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ns */.){.  if( p
14690 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
146a0 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
146b0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
146c0 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
146d0 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
146e0 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
146f0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
14700 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
14710 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14720 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
14730 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
14740 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
14750 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
14760 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
14770 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
14780 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
14790 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
147a0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
147b0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
147c0 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
147d0 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20  iColumn].pExpr, 
147e0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
147f0 65 77 20 26 26 20 70 45 78 70 72 2d 3e 70 43 6f  ew && pExpr->pCo
14800 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ll ){.        pN
14810 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78 70  ew->pColl = pExp
14820 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  r->pColl;.      
14830 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
14840 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
14850 78 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70  xpr);.      pExp
14860 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  r = pNew;.    }.
14870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78    }else{.    pEx
14880 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73  pr->pLeft = subs
14890 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
148a0 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
148b0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78  pEList);.    pEx
148c0 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
148d0 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  stExpr(db, pExpr
148e0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
148f0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  , pEList);.    i
14900 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
14910 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
14920 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
14930 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
14940 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
14950 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
14960 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
14970 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
14980 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  st(db, pExpr->x.
14990 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
149a0 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
149b0 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  }.  return pExpr
149c0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
149d0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20  substExprList(. 
149e0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
149f0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
14a00 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
14a10 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  re */.  ExprList
14a20 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
14a30 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64  List to scan and
14a40 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
14a50 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f  e substitutes */
14a60 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
14a70 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
14a80 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
14a90 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
14aa0 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
14ab0 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
14ac0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
14ad0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14ae0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
14af0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
14b00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  xpr; i++){.    p
14b10 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14b20 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
14b30 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
14b40 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  pr, iTable, pELi
14b50 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
14b60 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
14b70 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
14b80 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
14b90 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
14ba0 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c  rs here */.  Sel
14bb0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
14bc0 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
14bd0 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74  ement in which t
14be0 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
14bf0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
14c00 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
14c10 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65  * Table to be re
14c20 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72  placed */.  Expr
14c30 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
14c40 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
14c50 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72  alues */.){.  Sr
14c60 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73  cList *pSrc;.  s
14c70 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
14c80 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
14c90 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72   i;.  if( !p ) r
14ca0 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78  eturn;.  substEx
14cb0 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45  prList(db, p->pE
14cc0 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
14cd0 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
14ce0 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47  prList(db, p->pG
14cf0 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20  roupBy, iTable, 
14d00 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
14d10 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
14d20 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
14d30 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
14d40 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
14d50 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  xpr(db, p->pHavi
14d60 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ng, iTable, pELi
14d70 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  st);.  p->pWhere
14d80 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
14d90 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62   p->pWhere, iTab
14da0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
14db0 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
14dc0 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65  ->pPrior, iTable
14dd0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72  , pEList);.  pSr
14de0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
14df0 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20  ssert( pSrc );  
14e00 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c  /* Even for (SEL
14e10 45 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20  ECT 1) we have: 
14e20 70 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63  pSrc!=0 but pSrc
14e30 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69  ->nSrc==0 */.  i
14e40 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20  f( ALWAYS(pSrc) 
14e50 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72  ){.    for(i=pSr
14e60 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70  c->nSrc, pItem=p
14e70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  Src->a; i>0; i--
14e80 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
14e90 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
14ea0 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
14eb0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14ec0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
14ed0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
14ee0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
14ef0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
14f00 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14f10 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64  VIEW) */..#if !d
14f20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14f30 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
14f40 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14f50 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
14f60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
14f70 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
14f80 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  n subqueries in 
14f90 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a  order to speed.*
14fa0 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74  * execution.  It
14fb0 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
14fc0 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
14fd0 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
14fe0 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e  ening.** occurs.
14ff0 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73  .**.** To unders
15000 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74  tand the concept
15010 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20   of flattening, 
15020 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  consider the fol
15030 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a  lowing.** query:
15040 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
15050 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T a FROM (SELECT
15060 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
15070 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57  1 WHERE z<100) W
15080 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54  HERE a>5.**.** T
15090 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f  he default way o
150a0 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
150b0 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20  his query is to 
150c0 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73  execute the.** s
150d0 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e  ubquery first an
150e0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
150f0 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  lts in a tempora
15100 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  ry table, then.*
15110 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20  * run the outer 
15120 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65  query on that te
15130 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
15140 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77  This requires tw
15150 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72  o.** passes over
15160 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74   the data.  Furt
15170 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65  hermore, because
15180 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
15190 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69  able.** has no i
151a0 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52  ndices, the WHER
151b0 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  E clause on the 
151c0 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
151d0 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ot be.** optimiz
151e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
151f0 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
15200 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69  to rewrite queri
15210 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61  es such as the a
15220 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  bove into.** a s
15230 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63  ingle flat selec
15240 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  t, like this:.**
15250 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78  .**     SELECT x
15260 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
15270 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20  WHERE z<100 AND 
15280 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  a>5.**.** The co
15290 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  de generated for
152a0 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74   this simpificat
152b0 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
152c0 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
152d0 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
152e0 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
152f0 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
15300 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
15310 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
15320 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
15330 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
15340 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
15350 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
15360 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
15370 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
15380 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
15390 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
153a0 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
153b0 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
153c0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
153d0 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
153e0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
153f0 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
15400 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
15410 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65  gate or the oute
15420 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
15430 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
15440 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
15450 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
15460 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
15470 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a  eft outer join.*
15480 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e  *        (Origin
15490 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36  ally ticket #306
154a0 2e 20 20 53 74 72 65 6e 67 68 74 65 6e 65 64 20  .  Strenghtened 
154b0 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29  by ticket #3300)
154c0 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
154d0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
154e0 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
154f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
15500 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
15510 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75  **   (5)  The su
15520 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
15530 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
15540 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
15550 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
15560 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
15570 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
15580 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
15590 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
155a0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
155b0 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
155c0 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
155d0 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
155e0 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f  bquery has a FRO
155f0 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
15600 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75    (8)  The subqu
15610 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
15620 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
15630 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
15640 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
15650 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65   (9)  The subque
15660 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
15670 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
15680 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
15690 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
156a0 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
156b0 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62  *  (10)  The sub
156c0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
156d0 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
156e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
156f0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
15700 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a      use LIMIT..*
15710 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20  *.**  (11)  The 
15720 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
15730 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
15740 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
15750 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
15760 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74  **.**  (**)  Not
15770 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53   implemented.  S
15780 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
15790 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57  triction (3).  W
157a0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  as previously.**
157b0 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61          a separa
157c0 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64  te restriction d
157d0 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63  eriving from tic
157e0 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20  ket #350..**.** 
157f0 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
15800 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
15810 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
15820 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20  use LIMIT.**.** 
15830 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
15840 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
15850 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28   OFFSET.**.**  (
15860 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  15)  The outer q
15870 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74  uery is not part
15880 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
15890 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20  elect or the.** 
158a0 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
158b0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
158c0 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a  LIMIT clause..**
158d0 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
158e0 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
158f0 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
15900 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
15910 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
15920 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
15930 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71  gate or the subq
15940 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20  uery does.**    
15950 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20      not contain 
15960 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
15970 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
15980 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
15990 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
159a0 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
159b0 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
159c0 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
159d0 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65  **.**  (17)  The
159e0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
159f0 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  t a compound sel
15a00 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20  ect, or it is a 
15a10 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20  UNION ALL .**   
15a20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c       compound cl
15a30 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74  ause made up ent
15a40 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67  irely of non-agg
15a50 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20  regate queries, 
15a60 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  and .**        t
15a70 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a  he parent query:
15a80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
15a90 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  * is not itself 
15aa0 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
15ab0 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20  nd select,.**   
15ac0 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
15ad0 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
15ae0 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20  DISTINCT query, 
15af0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
15b00 2a 20 68 61 73 20 6e 6f 20 6f 74 68 65 72 20 74  * has no other t
15b10 61 62 6c 65 73 20 6f 72 20 73 75 62 2d 73 65 6c  ables or sub-sel
15b20 65 63 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ects in the FROM
15b30 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
15b40 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74        The parent
15b50 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d   and sub-query m
15b60 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ay contain WHERE
15b70 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63   clauses. Subjec
15b80 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72  t to.**        r
15b90 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20  ules (11), (13) 
15ba0 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d  and (14), they m
15bb0 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
15bc0 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20  ORDER BY,.**    
15bd0 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46      LIMIT and OF
15be0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  FSET clauses..**
15bf0 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
15c00 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
15c10 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
15c20 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
15c30 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
15c40 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73    ORDER by claus
15c50 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
15c60 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
15c70 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
15c80 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
15c90 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
15ca0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54  ..**.**  (19)  T
15cb0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
15cc0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
15cd0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
15ce0 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
15cf0 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52       have a WHER
15d00 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
15d10 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75   (20)  If the su
15d20 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
15d30 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
15d40 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75  en it must not u
15d50 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20  se.**        an 
15d60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
15d70 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20    Ticket #3773. 
15d80 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20   We could relax 
15d90 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a  this constraint.
15da0 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68  **        somewh
15db0 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61  at by saying tha
15dc0 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  t the terms of t
15dd0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
15de0 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20  se must.**      
15df0 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f    appear as unmo
15e00 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f  dified result co
15e10 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74  lumns in the out
15e20 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 0a 2a  er query.  But.*
15e30 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74  *        have ot
15e40 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
15e50 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61  s in mind to dea
15e60 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65  l with that case
15e70 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ..**.** In this 
15e80 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
15e90 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
15ea0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
15eb0 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
15ec0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
15ed0 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
15ee0 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
15ef0 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
15f00 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
15f10 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
15f20 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
15f30 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
15f40 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
15f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
15f60 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
15f70 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
15f80 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
15f90 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
15fa0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
15fb0 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
15fc0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
15fd0 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
15fe0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
15ff0 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
16000 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
16010 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
16020 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
16030 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
16040 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
16050 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
16060 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
16070 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
16080 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
16090 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
160a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
160b0 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
160c0 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
160d0 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
160e0 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
160f0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
16100 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
16110 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
16120 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
16130 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16140 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
16150 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
16160 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
16170 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
16180 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
16190 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
161a0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
161b0 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ions */.){.  con
161c0 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
161d0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
161e0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
161f0 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  t;.  Select *pPa
16200 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  rent;.  Select *
16210 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
16220 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
16230 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
16240 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b    Select *pSub1;
16250 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
16260 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73   to the rightmos
16270 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d  t select in sub-
16280 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
16290 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
162a0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
162b0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
162c0 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
162d0 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
162e0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
162f0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
16300 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
16310 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
16320 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
16330 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
16340 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
16350 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
16360 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
16370 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
16380 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
16390 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
163a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
163b0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
163c0 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
163e0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
163f0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
16400 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
16410 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
16420 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  subquery */.  sq
16430 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
16440 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68  se->db;..  /* Ch
16450 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
16460 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
16470 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
16480 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
16490 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
164a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
164b0 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e  ior==0 );  /* Un
164c0 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20  able to flatten 
164d0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73  compound queries
164e0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c   */.  if( db->fl
164f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 51 75 65  ags & SQLITE_Que
16500 72 79 46 6c 61 74 74 65 6e 65 72 20 29 20 72 65  ryFlattener ) re
16510 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
16520 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
16530 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
16540 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
16550 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
16560 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
16570 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
16580 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
16590 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
165a0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
165b0 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
165c0 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
165d0 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72  isAgg && subquer
165e0 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
165f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16600 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
16610 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (1)  */.  if( 
16620 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
16630 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
16640 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
16650 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
16660 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62  n (2)  */.  pSub
16670 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
16680 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
16690 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
166a0 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
166b0 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
166c0 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
166d0 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
166e0 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
166f0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
16700 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65  sions, we allowe
16710 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67  d some combining
16720 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   of LIMIT and OF
16730 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73  FSET.  ** becaus
16740 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20  e they could be 
16750 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70  computed at comp
16760 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77  ile-time.  But w
16770 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
16780 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65  FSET.  ** became
16790 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
167a0 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20  ssions, we were 
167b0 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65  forced to add re
167c0 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a  strictions (13).
167d0 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a    ** and (14). *
167e0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
167f0 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69  imit && p->pLimi
16800 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
16810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16820 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a  striction (13) *
16830 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  /.  if( pSub->pO
16840 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30  ffset ) return 0
16850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16870 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a  striction (14) *
16880 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  /.  if( p->pRigh
16890 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70  tmost && pSub->p
168a0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
168b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 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 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
168f0 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
16900 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
16910 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
16920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16930 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
16940 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
16950 66 28 20 28 28 70 53 75 62 2d 3e 73 65 6c 46 6c  f( ((pSub->selFl
16960 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
16970 74 29 21 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70  t)!=0 || pSub->p
16980 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20  Limit) .        
16990 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
169a0 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20  1 || isAgg) ){  
169b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
169c0 69 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38  ictions (4)(5)(8
169d0 29 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74  )(9) */.     ret
169e0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20  urn 0;       .  
169f0 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  }.  if( (p->selF
16a00 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
16a10 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65  ct)!=0 && subque
16a20 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
16a30 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
16a40 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16a50 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69   (6)  */.  }.  i
16a60 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
16a70 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
16a80 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
16a90 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16ac0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
16ad0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   */.  }.  if( is
16ae0 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  Agg && pSub->pOr
16af0 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
16b00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16b10 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
16b20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (16) */.  if( pS
16b30 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
16b40 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
16b50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16b60 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
16b70 28 31 39 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42  (19) */..  /* OB
16b80 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31  SOLETE COMMENT 1
16b90 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
16ba0 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
16bb0 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
16bc0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
16bd0 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
16be0 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
16bf0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
16c00 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
16c10 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
16c20 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
16c30 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
16c40 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
16c50 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
16c60 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
16c70 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
16c80 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
16c90 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
16ca0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
16cb0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
16cc0 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
16cd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
16ce0 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
16cf0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
16d00 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54   **.  ** OBSOLET
16d10 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a  E COMMENT 2:.  *
16d20 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
16d30 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
16d40 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
16d50 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
16d60 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
16d70 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
16d80 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
16d90 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
16da0 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
16db0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
16dc0 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
16dd0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
16de0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
16df0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
16e00 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
16e10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
16e20 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
16e30 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
16e40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
16e50 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
16e60 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
16e70 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
16e80 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
16e90 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
16ea0 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
16eb0 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
16ec0 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
16ed0 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
16ee0 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
16ef0 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
16f00 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56   **.  ** THIS OV
16f10 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45  ERRIDES OBSOLETE
16f20 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20   COMMENTS 1 AND 
16f30 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69  2 ABOVE:.  ** Ti
16f40 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73  cket #3300 shows
16f50 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
16f60 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
16f70 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20  of a LEFT JOIN. 
16f80 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77   ** is fraught w
16f90 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73  ith danger.  Bes
16fa0 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77  t to avoid the w
16fb0 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20  hole thing.  If 
16fc0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
16fd0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  y is the right t
16fe0 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
16ff0 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  IN, then do not 
17000 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  flatten..  */.  
17010 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a  if( (pSubitem->j
17020 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
17030 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
17040 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
17050 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
17060 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
17070 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
17080 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
17090 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
170a0 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
170b0 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
170c0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
170d0 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
170e0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
170f0 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
17100 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
17110 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
17120 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
17130 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
17140 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
17150 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
17160 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
17170 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17180 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
17190 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
171a0 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
171b0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
171c0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
171d0 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
171e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
171f0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
17200 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
17210 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
17220 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
17230 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
17240 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
17250 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
17260 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
17270 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
17280 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
17290 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
172a0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
172b0 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
172c0 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 69  egate );.      i
172d0 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  f( (pSub1->selFl
172e0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
172f0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
17300 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  )!=0.       || (
17310 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26  pSub1->pPrior &&
17320 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41   pSub1->op!=TK_A
17330 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 4e  LL) .       || N
17340 45 56 45 52 28 70 53 75 62 31 2d 3e 70 53 72 63  EVER(pSub1->pSrc
17350 3d 3d 30 29 20 7c 7c 20 70 53 75 62 31 2d 3e 70  ==0) || pSub1->p
17360 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a 20 20 20  Src->nSrc!=1.   
17370 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
17380 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
17390 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
173a0 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f  striction 18. */
173b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
173c0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
173d0 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
173e0 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64  ii=0; ii<p->pOrd
173f0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
17400 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
17410 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
17420 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20 72 65 74  i].iCol==0 ) ret
17430 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
17440 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a     }.  }..  /***
17450 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  ** If we reach t
17460 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74  his point, flatt
17470 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
17480 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a  ed. *****/..  /*
17490 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
174a0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
174b0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
174c0 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
174d0 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 41 75  ame;.  sqlite3Au
174e0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
174f0 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
17500 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50 61 72 73  , 0, 0);.  pPars
17510 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
17520 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
17530 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ext;..  /* If th
17540 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
17550 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
17560 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
17570 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e   (by restriction
17580 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38  s.  ** 17 and 18
17590 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20   above) it must 
175a0 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61  be a UNION ALL a
175b0 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  nd the parent qu
175c0 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62  ery must .  ** b
175d0 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  e of the form:. 
175e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
175f0 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20  ECT <expr-list> 
17600 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79  FROM (<sub-query
17610 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65  >) <where-clause
17620 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c  > .  **.  ** fol
17630 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44  lowed by any ORD
17640 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64  ER BY, LIMIT and
17650 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73  /or OFFSET claus
17660 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20  es. This block. 
17670 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20   ** creates N-1 
17680 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
17690 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f  rent query witho
176a0 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  ut any ORDER BY,
176b0 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20   LIMIT or .  ** 
176c0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61  OFFSET clauses a
176d0 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f  nd joins them to
176e0 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
176f0 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ide of the origi
17700 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55  nal.  ** using U
17710 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
17720 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
17730 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
17740 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20   of simple.  ** 
17750 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
17760 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
17770 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
17780 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  *.  ** Example:.
17790 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
177a0 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a  LECT a+1 FROM (.
177b0 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
177c0 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT x FROM tab.  
177d0 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
177e0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
177f0 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61  SELECT y FROM ta
17800 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
17810 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
17820 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
17830 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20  *2) FROM tab2.  
17840 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61  **     ) WHERE a
17850 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20  !=5 ORDER BY 1. 
17860 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f   **.  ** Transfo
17870 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rmed into:.  **.
17880 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
17890 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  x+1 FROM tab WHE
178a0 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE x+1!=5.  **  
178b0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
178c0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31  *     SELECT y+1
178d0 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
178e0 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  y+1!=5.  **     
178f0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
17900 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
17910 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57  2)+1 FROM tab2 W
17920 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21  HERE abs(z*2)+1!
17930 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45  =5.  **     ORDE
17940 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
17950 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68   We call this th
17960 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71  e "compound-subq
17970 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22  uery flattening"
17980 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75  ..  */.  for(pSu
17990 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  b=pSub->pPrior; 
179a0 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d  pSub; pSub=pSub-
179b0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65  >pPrior){.    Se
179c0 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  lect *pNew;.    
179d0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
179e0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
179f0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d  ;.    Expr *pLim
17a00 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
17a10 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69      Select *pPri
17a20 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
17a30 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
17a40 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  = 0;.    p->pSrc
17a50 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72   = 0;.    p->pPr
17a60 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ior = 0;.    p->
17a70 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
17a80 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65  pNew = sqlite3Se
17a90 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30  lectDup(db, p, 0
17aa0 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  );.    p->pLimit
17ab0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
17ac0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
17ad0 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
17ae0 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
17af0 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
17b00 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
17b10 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e   = 0;.    if( pN
17b20 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
17b30 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  New = pPrior;.  
17b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17b50 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
17b60 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  rior;.      pNew
17b70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
17b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
17b90 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20  Prior = pNew;.  
17ba0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
17bb0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
17bc0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  1;.  }..  /* Beg
17bd0 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  in flattening th
17be0 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79  e iFrom-th entry
17bf0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
17c00 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65  use .  ** in the
17c10 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
17c20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  */.  pSub = pSub
17c30 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  1 = pSubitem->pS
17c40 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c  elect;..  /* Del
17c50 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ete the transien
17c60 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
17c70 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
17c80 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
17c90 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
17ca0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
17cb0 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
17cc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
17cd0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
17ce0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
17cf0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
17d00 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
17d10 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74    pSubitem->zDat
17d20 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75  abase = 0;.  pSu
17d30 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30  bitem->zName = 0
17d40 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  ;.  pSubitem->zA
17d50 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62  lias = 0;.  pSub
17d60 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  item->pSelect = 
17d70 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64  0;..  /* Defer d
17d80 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c  eleting the Tabl
17d90 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  e object associa
17da0 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
17db0 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c  * subquery until
17dc0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
17dd0 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74   is.  ** complet
17de0 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d  e, since there m
17df0 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45  ay still exist E
17e00 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73  xpr.pTab entries
17e10 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72   that.  ** refer
17e20 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
17e30 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74   even after flat
17e40 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20  tening.  Ticket 
17e50 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3346..  **.  **
17e60 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
17e70 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55  is always non-NU
17e80 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72  LL by test restr
17e90 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74  ictions and test
17ea0 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20  s above..  */.  
17eb0 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69  if( ALWAYS(pSubi
17ec0 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b  tem->pTab!=0) ){
17ed0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
17ee0 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d  ToDel = pSubitem
17ef0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
17f00 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d  pTabToDel->nRef=
17f10 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73  =1 ){.      Pars
17f20 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
17f30 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
17f40 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  vel(pParse);.   
17f50 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e     pTabToDel->pN
17f60 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70  extZombie = pTop
17f70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
17f80 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  b;.      pToplev
17f90 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d  el->pZombieTab =
17fa0 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20   pTabToDel;.    
17fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
17fc0 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a  bToDel->nRef--;.
17fd0 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
17fe0 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
17ff0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
18000 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
18010 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
18020 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
18030 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
18040 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
18050 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
18060 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
18070 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
18080 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
18090 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
180a0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
180b0 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
180c0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
180d0 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
180e0 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
180f0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
18100 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
18110 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
18120 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
18130 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
18140 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
18150 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
18160 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
18170 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
18180 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
18190 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
181a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
181b0 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
181c0 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
181d0 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
181e0 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
181f0 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
18200 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
18210 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
18220 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
18230 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
18240 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
18250 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
18260 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
18270 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
18280 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
18290 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
182a0 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
182b0 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
182c0 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
182d0 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
182e0 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
182f0 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
18300 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
18310 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
18320 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
18330 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
18340 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
18350 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
18360 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
18370 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
18380 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
18390 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
183a0 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
183b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
183c0 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
183d0 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
183e0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
183f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
18400 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
18410 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18420 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
18430 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
18440 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
18450 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
18460 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
18470 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65  ntype;.    }else
18480 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18490 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f  pParent!=p );  /
184a0 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  * 2nd and subseq
184b0 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75  uent times throu
184c0 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
184d0 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72       pSrc = pPar
184e0 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  ent->pSrc = sqli
184f0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
18500 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
18510 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30       if( pSrc==0
18520 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
18530 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
18540 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
18550 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
18560 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
18570 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
18580 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20   single slot of 
18590 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
185a0 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20  of the outer.   
185b0 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74   ** query.  If t
185c0 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
185d0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c  more than one el
185e0 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f  ement in its FRO
185f0 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a  M clause,.    **
18600 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65   then expand the
18610 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20   outer query to 
18620 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69  make space for i
18630 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c  t to hold all el
18640 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ements.    ** of
18650 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
18660 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
18670 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
18680 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   **    SELECT * 
18690 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45  FROM tabA, (SELE
186a0 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20  CT * FROM sub1, 
186b0 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20  sub2), tabB;.   
186c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
186d0 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33  uter query has 3
186e0 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52   slots in its FR
186f0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20  OM clause.  One 
18700 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20  slot of the.    
18710 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28  ** outer query (
18720 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29  the middle slot)
18730 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
18740 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e  subquery.  The n
18750 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
18760 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78   of code will ex
18770 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65  pand the out que
18780 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20  ry to 4 slots.  
18790 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a  The middle.    *
187a0 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64  * slot is expand
187b0 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20  ed to two slots 
187c0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
187d0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20   space for the. 
187e0 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e     ** two elemen
187f0 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
18800 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
18810 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
18820 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
18830 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
18840 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20  ->pSrc = pSrc = 
18850 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
18860 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20  large(db, pSrc, 
18870 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
18880 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  1);.      if( db
18890 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
188a0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
188b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
188c0 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20      /* Transfer 
188d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
188e0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73  terms from the s
188f0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
18900 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
18910 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
18920 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
18930 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
18940 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
18950 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b  ete(db, pSrc->a[
18960 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29  i+iFrom].pUsing)
18970 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  ;.      pSrc->a[
18980 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
18990 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
189a0 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
189b0 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
189c0 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
189d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
189e0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74  ->a[iFrom].joint
189f0 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
18a00 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
18a10 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
18a20 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
18a30 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
18a40 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
18a50 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
18a60 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
18a70 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
18a80 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
18a90 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
18aa0 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
18ab0 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
18ac0 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
18ad0 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
18ae0 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
18af0 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
18b00 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
18b10 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
18b20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
18b30 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
18b40 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
18b50 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
18b60 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
18b70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18b80 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
18b90 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
18ba0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
18bb0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
18bc0 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
18bd0 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
18be0 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
18bf0 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
18c00 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
18c10 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
18c20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
18c30 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65     pList = pPare
18c40 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  nt->pEList;.    
18c50 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
18c60 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
18c70 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
18c80 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  a[i].zName==0 ){
18c90 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
18ca0 68 61 72 20 2a 7a 53 70 61 6e 20 3d 20 70 4c 69  har *zSpan = pLi
18cb0 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
18cc0 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
18cd0 59 53 28 7a 53 70 61 6e 29 20 29 7b 0a 20 20 20  YS(zSpan) ){.   
18ce0 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b         pList->a[
18cf0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
18d00 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
18d10 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  Span);.        }
18d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18d30 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
18d40 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45  (db, pParent->pE
18d50 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
18d60 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
18d70 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
18d80 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
18d90 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
18da0 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
18db0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
18dc0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
18dd0 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
18de0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
18df0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
18e00 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
18e10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
18e20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
18e30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18e40 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
18e50 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
18e60 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
18e70 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
18e80 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
18e90 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
18ea0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
18eb0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
18ec0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
18ed0 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
18ee0 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
18ef0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
18f00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
18f10 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
18f20 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
18f30 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
18f40 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
18f50 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
18f60 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
18f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18f80 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
18f90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18fa0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
18fb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
18fc0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
18fd0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
18fe0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
18ff0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
19000 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
19010 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
19020 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
19030 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
19040 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
19050 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
19060 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
19070 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
19080 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
190c0 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
190d0 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
190e0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
190f0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
19100 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
19110 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
19120 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
19130 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
19140 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
19150 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
19160 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
19170 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
19180 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
19190 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
191a0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
191b0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
191c0 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
191d0 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
191e0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
191f0 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
19200 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
19210 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
19220 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
19230 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
19240 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
19250 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
19260 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
19270 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
19280 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
19290 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
192a0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
192b0 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
192c0 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
192d0 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
192e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
192f0 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
19300 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
19310 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
19320 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
19330 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
19340 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
19350 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
19360 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
19370 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
19380 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
19390 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
193a0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
193b0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
193c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
193d0 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
193e0 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
193f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
19400 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
19410 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
19420 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
19430 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
19440 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
19450 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
19460 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
19470 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
19480 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
19490 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  IEW) */../*.** A
194a0 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43  nalyze the SELEC
194b0 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
194c0 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
194d0 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
194e0 2a 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20  * is a min() or 
194f0 6d 61 78 28 29 20 71 75 65 72 79 2e 20 52 65 74  max() query. Ret
19500 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
19510 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
19520 52 44 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a  RDERBY_MAX if .*
19530 2a 20 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74  * it is, or 0 ot
19540 68 65 72 77 69 73 65 2e 20 41 74 20 70 72 65 73  herwise. At pres
19550 65 6e 74 2c 20 61 20 71 75 65 72 79 20 69 73 20  ent, a query is 
19560 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
19570 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28  .** a min()/max(
19580 29 20 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a  ) query if:.**.*
19590 2a 20 20 20 31 2e 20 54 68 65 72 65 20 69 73 20  *   1. There is 
195a0 61 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20  a single object 
195b0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
195c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54  se..**.**   2. T
195d0 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65  here is a single
195e0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
195f0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61  he result set, a
19600 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  nd it is.**     
19610 20 65 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f   either min(x) o
19620 72 20 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20  r max(x), where 
19630 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65  x is a column re
19640 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  ference..*/.stat
19650 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
19660 79 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  y(Select *p){.  
19670 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45  Expr *pExpr;.  E
19680 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
19690 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
196a0 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
196b0 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 57 48  r!=1 ) return WH
196c0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
196d0 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45  AL;.  pExpr = pE
196e0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
196f0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
19700 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
19710 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
19720 20 69 66 28 20 4e 45 56 45 52 28 45 78 70 72 48   if( NEVER(ExprH
19730 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
19740 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29  , EP_xIsSelect))
19750 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
19760 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
19770 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  .pList;.  if( pE
19780 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73  List==0 || pELis
19790 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
197a0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
197b0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
197c0 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
197d0 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48 45  UMN ) return WHE
197e0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
197f0 4c 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  L;.  assert( !Ex
19800 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
19810 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
19820 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ) );.  if( sqlit
19830 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
19840 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 69 6e 22 29  >u.zToken,"min")
19850 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
19860 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
19870 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  MIN;.  }else if(
19880 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
19890 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
198a0 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "max")==0 ){.   
198b0 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
198c0 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20  DERBY_MAX;.  }. 
198d0 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
198e0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a  DERBY_NORMAL;.}.
198f0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
19900 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
19910 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
19920 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
19930 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
19940 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
19950 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73  gment is the ass
19960 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74  ociated aggregat
19970 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54  e-info object. T
19980 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
19990 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45   tests if the SE
199a0 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66  LECT is of the f
199b0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  orm:.**.**   SEL
199c0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
199d0 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68  M <tbl>.**.** wh
199e0 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64  ere table is a d
199f0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e  atabase table, n
19a00 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ot a sub-select 
19a10 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20  or view. If the 
19a20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61  query.** does ma
19a30 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e  tch this pattern
19a40 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
19a50 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62   to the Table ob
19a60 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
19a70 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65  g.** <tbl> is re
19a80 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
19a90 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
19aa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c  ..*/.static Tabl
19ab0 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  e *isSimpleCount
19ac0 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49  (Select *p, AggI
19ad0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
19ae0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
19af0 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20   Expr *pExpr;.. 
19b00 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72   assert( !p->pGr
19b10 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20  oupBy );..  if( 
19b20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e  p->pWhere || p->
19b30 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
19b40 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d   .   || p->pSrc-
19b50 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70  >nSrc!=1 || p->p
19b60 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
19b70 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t.  ){.    retur
19b80 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
19b90 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
19ba0 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  pTab;.  pExpr = 
19bb0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
19bc0 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
19bd0 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e   pTab && !pTab->
19be0 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72  pSelect && pExpr
19bf0 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72   );..  if( IsVir
19c00 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
19c10 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
19c20 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
19c30 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
19c40 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49   0;.  if( (pAggI
19c50 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46  nfo->aFunc[0].pF
19c60 75 6e 63 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  unc->flags&SQLIT
19c70 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30  E_FUNC_COUNT)==0
19c80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
19c90 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  f( pExpr->flags&
19ca0 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  EP_Distinct ) re
19cb0 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72  turn 0;..  retur
19cc0 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
19cd0 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   If the source-l
19ce0 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20  ist item passed 
19cf0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77  as an argument w
19d00 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  as augmented wit
19d10 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20  h an.** INDEXED 
19d20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
19d30 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  try to locate th
19d40 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65  e specified inde
19d50 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77  x. If there.** w
19d60 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65  as such a clause
19d70 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69   and the named i
19d80 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66  ndex cannot be f
19d90 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  ound, return .**
19da0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e   SQLITE_ERROR an
19db0 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
19dc0 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65   in pParse. Othe
19dd0 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20  rwise, populate 
19de0 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65  .** pFrom->pInde
19df0 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  x and return SQL
19e00 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
19e10 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
19e20 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61  ookup(Parse *pPa
19e30 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
19e40 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
19e50 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70  {.  if( pFrom->p
19e60 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49  Tab && pFrom->zI
19e70 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c  ndex ){.    Tabl
19e80 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
19e90 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
19ea0 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d  *zIndex = pFrom-
19eb0 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64  >zIndex;.    Ind
19ec0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
19ed0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
19ee0 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
19ef0 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
19f00 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
19f10 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20  , zIndex); .    
19f20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70      pIdx=pIdx->p
19f30 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Next.    );.    
19f40 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20  if( !pIdx ){.   
19f50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
19f60 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
19f70 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  uch index: %s", 
19f80 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20  zIndex, 0);.    
19f90 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
19fa0 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
19fb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
19fc0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
19fd0 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20  pFrom->pIndex = 
19fe0 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pIdx;.  }.  retu
19ff0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a000 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1a010 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
1a020 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
1a030 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
1a040 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1a050 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
1a060 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
1a070 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
1a080 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
1a090 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1a0a0 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
1a0b0 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
1a0c0 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
1a0d0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
1a0e0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
1a0f0 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
1a100 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
1a110 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
1a120 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
1a130 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
1a140 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1a150 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
1a160 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
1a170 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
1a180 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
1a190 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
1a1a0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
1a1b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
1a1c0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
1a1d0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
1a1e0 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
1a1f0 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
1a200 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
1a210 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
1a220 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
1a230 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
1a240 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
1a250 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
1a260 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
1a270 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
1a280 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74  p the presistent
1a290 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
1a2a0 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
1a2b0 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
1a2c0 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
1a2d0 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
1a2e0 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  use to accomodat
1a2f0 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
1a300 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
1a310 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
1a320 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
1a330 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
1a340 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
1a350 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
1a360 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
1a370 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
1a380 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
1a390 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
1a3a0 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
1a3b0 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
1a3c0 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
1a3d0 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
1a3e0 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
1a3f0 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
1a400 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
1a410 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
1a420 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
1a430 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
1a440 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f   in TABLE..**.*/
1a450 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
1a460 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65  ctExpander(Walke
1a470 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1a480 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
1a490 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
1a4a0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  r->pParse;.  int
1a4b0 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c   i, j, k;.  SrcL
1a4c0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
1a4d0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1a4e0 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
1a4f0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
1a500 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1a510 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
1a520 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1a530 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
1a540 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1a550 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70   }.  if( NEVER(p
1a560 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 70  ->pSrc==0) || (p
1a570 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1a580 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
1a590 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1a5a0 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73  rune;.  }.  p->s
1a5b0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
1a5c0 70 61 6e 64 65 64 3b 0a 20 20 70 54 61 62 4c 69  panded;.  pTabLi
1a5d0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
1a5e0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
1a5f0 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
1a600 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
1a610 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
1a620 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
1a630 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
1a640 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1a650 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1a660 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
1a670 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1a680 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
1a690 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f   pTabList);..  /
1a6a0 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
1a6b0 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74  table named in t
1a6c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1a6d0 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49  f the select.  I
1a6e0 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20  f.  ** an entry 
1a6f0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1a700 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79  se is a subquery
1a710 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61   instead of a ta
1a720 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a  ble or view,.  *
1a730 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
1a740 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
1a750 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73  structure to des
1a760 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65  cribe the subque
1a770 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
1a780 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
1a790 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
1a7a0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
1a7b0 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
1a7c0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28  e *pTab;.    if(
1a7d0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
1a7e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1a7f0 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61   statement has a
1a800 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
1a810 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20  ared.  There is 
1a820 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a  no need.      **
1a830 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20   to go further. 
1a840 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1a850 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72   i==0 );.      r
1a860 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
1a870 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1a880 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
1a890 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1a8a0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1a8b0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
1a8c0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
1a8d0 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ct;.      /* A s
1a8e0 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
1a8f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1a900 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
1a910 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30   assert( pSel!=0
1a920 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a930 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
1a940 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a950 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
1a960 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
1a970 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
1a980 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
1a990 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1a9a0 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
1a9b0 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
1a9c0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
1a9d0 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
1a9e0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
1a9f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
1aa00 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1aa10 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65  , "sqlite_subque
1aa20 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29  ry_%p_", (void*)
1aa30 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
1aa40 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
1aa50 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
1aa60 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
1aa70 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
1aa80 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1aa90 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
1aaa0 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
1aab0 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
1aac0 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
1aad0 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  -1;.      pTab->
1aae0 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
1aaf0 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
1ab00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ab10 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
1ab20 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
1ab30 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
1ab40 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
1ab50 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
1ab60 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
1ab70 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
1ab80 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
1ab90 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
1aba0 28 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d  (pParse,0,pFrom-
1abb0 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44  >zName,pFrom->zD
1abc0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20  atabase);.      
1abd0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
1abe0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1abf0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
1ac00 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ++;.#if !defined
1ac10 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1ac20 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28  W) || !defined (
1ac30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1ac40 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20  UALTABLE).      
1ac50 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
1ac60 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  t || IsVirtual(p
1ac70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
1ac80 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
1ac90 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
1aca0 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
1acb0 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
1acc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
1acd0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
1ace0 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20  pParse, pTab) ) 
1acf0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1ad00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1ad10 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
1ad20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
1ad30 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
1ad40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
1ad50 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
1ad60 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ct, 0);.        
1ad70 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1ad80 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  t(pWalker, pFrom
1ad90 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
1ada0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1adb0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
1adc0 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
1add0 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  by the INDEXED B
1ade0 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79  Y clause, if any
1adf0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
1ae00 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
1ae10 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f  kup(pParse, pFro
1ae20 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
1ae30 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1ae40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
1ae50 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
1ae60 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
1ae70 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1ae80 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
1ae90 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1aea0 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65  Failed || sqlite
1aeb0 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
1aec0 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
1aed0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1aee0 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76    }..  /* For ev
1aef0 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
1af00 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
1af10 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
1af20 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
1af30 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
1af40 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
1af50 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
1af60 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
1af70 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
1af80 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
1af90 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
1afa0 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
1afb0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
1afc0 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
1afd0 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
1afe0 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
1aff0 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
1b000 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
1b010 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
1b020 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
1b030 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
1b040 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
1b050 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
1b060 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
1b070 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
1b080 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
1b090 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
1b0a0 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
1b0b0 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
1b0c0 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
1b0d0 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
1b0e0 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
1b0f0 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
1b100 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
1b110 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
1b120 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
1b130 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
1b140 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1b150 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
1b160 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
1b170 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
1b180 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
1b190 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
1b1a0 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
1b1b0 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
1b1c0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
1b1d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
1b1e0 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
1b1f0 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
1b200 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
1b210 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
1b220 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
1b230 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
1b240 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
1b250 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1b260 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
1b270 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
1b280 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
1b290 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
1b2a0 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
1b2b0 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
1b2c0 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
1b2d0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
1b2e0 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
1b2f0 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
1b300 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1b310 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
1b320 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
1b330 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
1b340 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
1b350 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1b360 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
1b370 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
1b380 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
1b390 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1b3b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1b3c0 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
1b3d0 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
1b3e0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
1b3f0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; k++){.      Ex
1b400 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45  pr *pE = a[k].pE
1b410 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
1b420 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
1b430 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
1b440 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1b450 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
1b460 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  & (pE->op!=TK_DO
1b470 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d  T || pE->pRight-
1b480 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a  >op!=TK_ALL) ){.
1b490 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1b4a0 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65  particular expre
1b4b0 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ssion does not n
1b4c0 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
1b4d0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
1b4e0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1b4f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1b500 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
1b510 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20  , a[k].pExpr);. 
1b520 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
1b530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
1b540 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
1b550 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
1b560 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
1b570 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
1b580 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d  nExpr-1].zSpan =
1b590 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20   a[k].zSpan;.   
1b5a0 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d         a[k].zNam
1b5b0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
1b5c0 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b   a[k].zSpan = 0;
1b5d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b5e0 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
1b5f0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1b600 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1b610 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1b620 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
1b630 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
1b640 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
1b650 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
1b660 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
1b670 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
1b680 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
1b690 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
1b6a0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d       char *zTNam
1b6b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1b6c0 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
1b6d0 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
1b6e0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
1b6f0 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
1b700 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c    assert( pE->pL
1b710 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
1b720 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1b730 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d  rHasProperty(pE-
1b740 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61  >pLeft, EP_IntVa
1b750 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1b760 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70    zTName = pE->p
1b770 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
1b780 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b790 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
1b7a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1b7b0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
1b7c0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
1b7d0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
1b7e0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
1b7f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
1b800 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
1b810 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
1b820 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
1b830 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
1b840 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
1b850 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
1b860 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
1b870 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
1b880 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
1b890 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
1b8a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1b8b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b8c0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
1b8d0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1b8e0 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
1b8f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1b900 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1b910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b920 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
1b930 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1b940 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
1b950 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
1b960 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
1b970 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20  , *pRight;.     
1b980 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
1b990 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
1b9a0 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
1b9b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
1b9c0 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
1b9d0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
1b9e0 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
1b9f0 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
1ba00 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
1ba10 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
1ba20 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
1ba40 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
1ba50 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
1ba60 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
1ba70 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
1ba80 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
1ba90 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
1baa0 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20  den' (currently 
1bab0 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20  only possible.  
1bac0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
1bad0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29   virtual tables)
1bae0 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65  , do not include
1baf0 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e   it in the expan
1bb00 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
1bb10 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
1bb20 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
1bb30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
1bb40 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  f( IsHiddenColum
1bb50 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
1bb60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1bb70 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74     assert(IsVirt
1bb80 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20  ual(pTab));.    
1bb90 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1bba0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1bbb0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  }..            i
1bbc0 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
1bbd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1bbe0 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
1bbf0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  >jointype & JT_N
1bc00 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20  ATURAL)!=0.     
1bc10 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61             && ta
1bc20 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
1bc30 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a  x(pTabList, i, z
1bc40 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20  Name, 0, 0).    
1bc50 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc70 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
1bc80 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
1bc90 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
1bca0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
1bcb0 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74     ** table to t
1bcc0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
1bcd0 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  join */.        
1bce0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1bcf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1bd00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1bd10 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
1bd20 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55  tIndex(pFrom->pU
1bd30 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
1bd40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1bd50 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
1bd60 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
1bd70 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
1bd80 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
1bd90 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
1bda0 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
1bdb0 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
1bdc0 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
1bdd0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1bde0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1bdf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
1be00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
1be10 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
1be20 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61  r(db, TK_ID, zNa
1be30 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1be40 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d   zColname = zNam
1be50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e;.            z
1be60 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  ToFree = 0;.    
1be70 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
1be80 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
1be90 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
1bea0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
1beb0 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  *pLeft;.        
1bec0 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
1bed0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
1bee0 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  _ID, zTabName);.
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1bf00 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
1bf10 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
1bf20 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
1bf30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1bf40 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
1bf50 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
1bf60 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
1bf70 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1bf80 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
1bf90 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
1bfb0 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
1bfc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1bfd0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
1bfe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1bff0 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
1c000 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
1c010 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
1c020 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
1c030 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1c040 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
1c050 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
1c060 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d  name.z = zColnam
1c070 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
1c080 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69  Colname.n = sqli
1c090 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
1c0a0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
1c0b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1c0c0 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
1c0d0 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d  , pNew, &sColnam
1c0e0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
1c0f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1c100 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20  (db, zToFree);. 
1c110 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c120 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1c130 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
1c140 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1c150 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
1c160 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c170 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1c180 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
1c190 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
1c1a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c1b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1c1c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1c1d0 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
1c1e0 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
1c1f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1c200 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1c210 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1c220 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
1c230 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
1c240 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53   pNew;.  }.#if S
1c250 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
1c260 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
1c270 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
1c280 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
1c290 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
1c2a0 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
1c2b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c2c0 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
1c2d0 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
1c2e0 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  set");.  }.#endi
1c2f0 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  f.  return WRC_C
1c300 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
1c310 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
1c320 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
1c330 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a  ee walker..**.**
1c340 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
1c350 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72  ne is the Walker
1c360 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
1c370 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  hen expression t
1c380 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b  rees.** are walk
1c390 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61  ed without any a
1c3a0 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b  ctions being tak
1c3b0 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e  en at each node.
1c3c0 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a    Presumably,.**
1c3d0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
1c3e0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57  ne is used for W
1c3f0 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
1c400 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c  ack then .** Wal
1c410 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
1c420 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f  ack is set to do
1c430 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75   something usefu
1c440 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20  l for every .** 
1c450 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
1c460 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
1c470 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 57  static int exprW
1c480 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a  alkNoop(Walker *
1c490 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e  NotUsed, Expr *N
1c4a0 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
1c4b0 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
1c4c0 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
1c4d0 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
1c4e0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
1c4f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22  * This routine "
1c500 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43  expands" a SELEC
1c510 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
1c520 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75  all of its subqu
1c530 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64  eries..** For ad
1c540 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1c550 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20  tion on what it 
1c560 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64  means to "expand
1c570 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  " a SELECT.** st
1c580 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65  atement, see the
1c590 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
1c5a0 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72  selectExpand wor
1c5b0 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f  ker callback abo
1c5c0 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64  ve..**.** Expand
1c5d0 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61  ing a SELECT sta
1c5e0 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  tement is the fi
1c5f0 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63  rst step in proc
1c600 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45  essing a.** SELE
1c610 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  CT statement.  T
1c620 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1c630 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61  ent must be expa
1c640 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e  nded before.** n
1c650 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ame resolution i
1c660 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a  s performed..**.
1c670 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
1c680 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72  oes wrong, an er
1c690 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
1c6a0 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72  ritten into pPar
1c6b0 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  se..** The calli
1c6c0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ng function can 
1c6d0 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c  detect the probl
1c6e0 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  em by looking at
1c6f0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a   pParse->nErr.**
1c700 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e   and/or pParse->
1c710 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c730 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
1c740 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  pand(Parse *pPar
1c750 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
1c760 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ect){.  Walker w
1c770 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
1c780 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
1c790 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 45 78 70  pander;.  w.xExp
1c7a0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
1c7b0 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
1c7c0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1c7d0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
1c7e0 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
1c7f0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
1c800 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1c810 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  Y./*.** This is 
1c820 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  a Walker.xSelect
1c830 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
1c840 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
1c850 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28  3SelectTypeInfo(
1c860 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
1c870 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46  **.** For each F
1c880 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1c890 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e  ery, add Column.
1c8a0 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e  zType and Column
1c8b0 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  .zColl.** inform
1c8c0 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62  ation to the Tab
1c8d0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
1c8e0 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
1c8f0 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f   result set.** o
1c900 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e  f that subquery.
1c910 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  .**.** The Table
1c920 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1c930 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
1c940 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f  esult set was co
1c950 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20  nstructed.** by 
1c960 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
1c970 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e   but the type an
1c980 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
1c990 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74  rmation was omit
1c9a0 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70  ted.** at that p
1c9b0 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65  oint because ide
1c9c0 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74  ntifiers had not
1c9d0 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76   yet been resolv
1c9e0 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
1c9f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
1ca00 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20  fter identifier 
1ca10 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
1ca20 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
1ca30 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
1ca40 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
1ca50 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
1ca60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1ca70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
1ca80 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
1ca90 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1caa0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
1cab0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
1cac0 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
1cad0 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ed );.  if( (p->
1cae0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
1caf0 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b  sTypeInfo)==0 ){
1cb00 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
1cb10 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e   |= SF_HasTypeIn
1cb20 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d  fo;.    pParse =
1cb30 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
1cb40 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
1cb50 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f   p->pSrc;.    fo
1cb60 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1cb70 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1cb80 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1cb90 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
1cba0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1cbb0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
1cbc0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61    if( ALWAYS(pTa
1cbd0 62 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e  b!=0) && (pTab->
1cbe0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
1cbf0 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20  hemeral)!=0 ){. 
1cc00 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d         /* A sub-
1cc10 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
1cc20 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1cc30 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20  LECT */.        
1cc40 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
1cc50 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
1cc60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1cc70 53 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 77  Sel );.        w
1cc80 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
1cc90 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c  or ) pSel = pSel
1cca0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
1ccb0 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
1ccc0 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
1ccd0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  n(pParse, pTab->
1cce0 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  nCol, pTab->aCol
1ccf0 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d  , pSel);.      }
1cd00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1cd10 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1cd20 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
1cd30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1cd40 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
1cd50 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
1cd60 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
1cd70 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
1cd80 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
1cd90 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
1cda0 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
1cdb0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1cdc0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
1cdd0 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
1cde0 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
1cdf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ce00 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
1ce10 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
1ce20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
1ce30 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
1ce40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1ce50 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
1ce60 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
1ce70 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
1ce80 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
1ce90 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
1cea0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
1ceb0 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
1cec0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
1ced0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1cee0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
1cef0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
1cf00 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1cf10 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
1cf20 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
1cf30 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
1cf40 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
1cf50 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
1cf60 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
1cf70 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
1cf80 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
1cf90 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
1cfa0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
1cfb0 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
1cfc0 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
1cfd0 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
1cfe0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
1cff0 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
1d000 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
1d010 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
1d020 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
1d030 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
1d040 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
1d050 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
1d060 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
1d070 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
1d080 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
1d090 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
1d0a0 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
1d0b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d0c0 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
1d0d0 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
1d0e0 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
1d0f0 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
1d100 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
1d110 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
1d120 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
1d130 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1d140 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1d150 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1d160 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1d170 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
1d180 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
1d190 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
1d1a0 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
1d1b0 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
1d1c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1d1d0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
1d1e0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
1d1f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d200 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
1d210 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
1d220 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
1d230 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
1d240 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  and(pParse, p);.
1d250 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1d260 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1d270 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
1d280 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
1d290 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61  eSelectNames(pPa
1d2a0 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43  rse, p, pOuterNC
1d2b0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1d2c0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
1d2d0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1d2e0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
1d2f0 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70  ectAddTypeInfo(p
1d300 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  Parse, p);.}../*
1d310 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
1d320 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
1d330 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
1d340 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
1d350 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
1d360 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
1d370 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
1d380 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
1d390 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
1d3a0 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
1d3b0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
1d3c0 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e   simply stores N
1d3d0 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
1d3e0 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  hose memory cell
1d3f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1d400 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
1d410 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
1d420 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1d430 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
1d440 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1d450 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1d460 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
1d470 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41  *pFunc;.  if( pA
1d480 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41  ggInfo->nFunc+pA
1d490 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ggInfo->nColumn=
1d4a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1d4b0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1d4c0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
1d4d0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1d4e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d4f0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1d500 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
1d510 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  i].iMem);.  }.  
1d520 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
1d530 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
1d540 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
1d550 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
1d560 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1d570 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1d580 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d  ll, 0, pFunc->iM
1d590 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75  em);.    if( pFu
1d5a0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
1d5b0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1d5c0 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
1d5d0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1d5e0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1d5f0 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pE, EP_xIsSele
1d600 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
1d610 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20   pE->x.pList==0 
1d620 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pE->x.pList->
1d630 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
1d640 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1d650 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
1d660 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73  TINCT aggregates
1d670 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
1d680 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20  ly one ".       
1d690 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b      "argument");
1d6a0 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
1d6b0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
1d6c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d6d0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
1d6e0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
1d6f0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
1d700 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  rse, pE->x.pList
1d710 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d720 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d730 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1d740 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
1d750 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d770 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
1d780 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
1d790 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
1d7a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
1d7b0 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
1d7c0 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
1d7d0 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
1d7e0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1d7f0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
1d800 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
1d810 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1d820 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
1d830 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
1d840 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
1d850 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
1d860 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1d870 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
1d880 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
1d890 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
1d8a0 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
1d8b0 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
1d8c0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
1d8d0 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
1d8e0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
1d8f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1d900 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1d910 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
1d920 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1d930 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ct) );.    sqlit
1d940 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d950 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
1d960 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
1d970 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
1d980 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1d990 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
1d9a0 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
1d9b0 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
1d9c0 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1d9d0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
1d9e0 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
1d9f0 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
1da00 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
1da10 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
1da20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1da30 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
1da40 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
1da50 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
1da60 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
1da70 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1da80 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1da90 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1daa0 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
1dab0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
1dac0 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
1dad0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
1dae0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1daf0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
1db00 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
1db10 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
1db20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1db30 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
1db40 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
1db50 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
1db60 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
1db70 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1db80 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
1db90 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
1dba0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1dbb0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
1dbc0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1dbd0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1dbe0 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
1dbf0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1dc00 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
1dc10 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1dc20 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
1dc30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1dc40 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1dc50 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
1dc60 65 67 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 7d  egAgg, 0);.    }
1dc70 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
1dc80 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
1dc90 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
1dca0 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
1dcb0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
1dcc0 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
1dcd0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1dce0 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
1dcf0 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
1dd00 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
1dd10 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
1dd20 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
1dd30 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
1dd40 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
1dd50 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51  Func->flags & SQ
1dd60 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
1dd70 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
1dd80 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
1dd90 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1dda0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1ddb0 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
1ddc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1ddd0 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
1dde0 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
1ddf0 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
1de00 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
1de10 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
1de20 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
1de30 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
1de40 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
1de50 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1de60 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1de70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
1de80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1de90 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
1dea0 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
1deb0 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
1dec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1ded0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1dee0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
1def0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
1df00 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
1df10 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  EQ);.    }.    s
1df20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1df30 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20  (v, OP_AggStep, 
1df40 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69  0, regAgg, pF->i
1df50 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
1df60 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
1df70 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
1df80 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
1df90 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1dfa0 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
1dfb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1dfc0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1dfd0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
1dfe0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  g, nArg);.    sq
1dff0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1e000 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
1e010 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
1e020 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
1e030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e040 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1e050 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
1e060 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e070 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
1e080 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1e090 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74  * Before populat
1e0a0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
1e0b0 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63  tor registers, c
1e0c0 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
1e0d0 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65  cache..  ** Othe
1e0e0 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66  rwise, if any of
1e0f0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f   the required co
1e100 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20  lumn values are 
1e110 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20  already present 
1e120 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  .  ** in registe
1e130 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43  rs, sqlite3ExprC
1e140 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50  ode() may use OP
1e150 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74  _SCopy to copy t
1e160 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f  he value.  ** to
1e170 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62   pC->iMem. But b
1e180 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76  y the time the v
1e190 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68  alue is used, th
1e1a0 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73  e original regis
1e1b0 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76  ter.  ** may hav
1e1c0 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76  e been used, inv
1e1d0 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e  alidating the un
1e1e0 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20  derlying buffer 
1e1f0 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a  holding the.  **
1e200 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61   text or blob va
1e210 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20  lue. See ticket 
1e220 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20  [883034dcb5]..  
1e230 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20  **.  ** Another 
1e240 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62  solution would b
1e250 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  e to change the 
1e260 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f  OP_SCopy used to
1e270 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a   copy cached.  *
1e280 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f  * values to an O
1e290 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 73  P_Copy..  */.  s
1e2a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
1e2b0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
1e2c0 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
1e2d0 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
1e2e0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
1e2f0 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
1e300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1e310 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
1e320 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65  ->pExpr, pC->iMe
1e330 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  m);.  }.  pAggIn
1e340 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
1e350 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
1e360 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
1e370 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  se);.}../*.** Ge
1e380 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1e390 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1e3a0 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
1e3b0 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
1e3c0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
1e3d0 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65  s are distribute
1e3e0 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79  d in various way
1e3f0 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  s depending on t
1e400 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
1e410 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  f the SelectDest
1e420 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
1e430 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e  ed to by argumen
1e440 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f  t pDest.** as fo
1e450 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
1e460 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20 20   pDest->eDest   
1e470 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d   Result.**     -
1e480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
1e490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e4a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e4b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
1e4c0 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20 20    SRT_Output    
1e4d0 20 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f 77    Generate a row
1e4e0 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69 6e   of output (usin
1e4f0 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  g the OP_ResultR
1e500 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
1e510 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64 65            opcode
1e520 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69  ) for each row i
1e530 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
1e540 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1e550 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c 79  Mem         Only
1e560 20 76 61 6c 69 64 20 69 66 20 74 68 65 20 72 65   valid if the re
1e570 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c 65  sult is a single
1e580 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20   column..**     
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5a0 53 74 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  Store the first 
1e5b0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69  column of the fi
1e5c0 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a  rst result row.*
1e5d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e5e0 20 20 20 20 20 20 69 6e 20 72 65 67 69 73 74 65        in registe
1e5f0 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 74  r pDest->iParm t
1e600 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  hen abandon the 
1e610 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  rest.**         
1e620 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
1e630 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
1e640 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70 6c  destination impl
1e650 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a 2a  ies "LIMIT 1"..*
1e660 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74  *.**     SRT_Set
1e670 20 20 20 20 20 20 20 20 20 54 68 65 20 72 65 73           The res
1e680 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20 73 69  ult must be a si
1e690 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53 74  ngle column.  St
1e6a0 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20 20 20  ore each.**     
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6c0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 61 73  row of result as
1e6d0 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61 62 6c   the key in tabl
1e6e0 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 20  e pDest->iParm. 
1e6f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1e700 20 20 20 20 20 20 20 20 41 70 70 6c 79 20 74 68          Apply th
1e710 65 20 61 66 66 69 6e 69 74 79 20 70 44 65 73 74  e affinity pDest
1e720 2d 3e 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72  ->affinity befor
1e730 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20  e storing.**    
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65 64 20   results.  Used 
1e760 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49 4e  to implement "IN
1e770 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a   (SELECT ...)"..
1e780 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
1e790 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
1e7a0 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
1e7b0 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1e7c0 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1e7d0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
1e7e0 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52 65  T_Except      Re
1e7f0 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f  move results fro
1e800 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  m the temporary 
1e810 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1e820 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
1e830 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74  T_Table       St
1e840 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ore results in t
1e850 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
1e860 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 20  Dest->iParm..** 
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65      This is like
1e890 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65 78   SRT_EphemTab ex
1e8a0 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74 61  cept that the ta
1e8b0 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ble.**          
1e8c0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61 73             is as
1e8d0 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79  sumed to already
1e8e0 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20   be open..**.** 
1e8f0 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62      SRT_EphemTab
1e900 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74 65      Create an te
1e910 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1e920 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73  est->iParm and s
1e930 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  tore.**         
1e940 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1e950 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68  result there. Th
1e960 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1e970 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20   open after.**  
1e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e990 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 54     returning.  T
1e9a0 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f  his is like SRT_
1e9b0 54 61 62 6c 65 20 65 78 63 65 70 74 20 74 68 61  Table except tha
1e9c0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1e9d0 20 20 20 20 20 20 20 20 20 74 68 69 73 20 64 65           this de
1e9e0 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f  stination uses O
1e9f0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1ea00 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20 20 20  to create.**    
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 74 68 65 20 74 61 62 6c 65 20 66 69 72 73 74   the table first
1ea30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1ea40 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65 6e 65  Coroutine   Gene
1ea50 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e  rate a co-routin
1ea60 65 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  e that returns a
1ea70 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20   new row of.**  
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 72 65 73 75 6c 74 73 20 65 61 63 68 20     results each 
1eaa0 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76 6f 6b  time it is invok
1eab0 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79 20 70  ed.  The entry p
1eac0 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  oint.**         
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
1eae0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73  he co-routine is
1eaf0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
1eb00 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ter pDest->iParm
1eb10 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1eb20 45 78 69 73 74 73 20 20 20 20 20 20 53 74 6f 72  Exists      Stor
1eb30 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20  e a 1 in memory 
1eb40 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72  cell pDest->iPar
1eb50 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a  m if the result.
1eb60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1eb70 20 20 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f         set is no
1eb80 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20  t empty..**.**  
1eb90 20 20 20 53 52 54 5f 44 69 73 63 61 72 64 20 20     SRT_Discard  
1eba0 20 20 20 54 68 72 6f 77 20 74 68 65 20 72 65 73     Throw the res
1ebb0 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68 69 73  ults away.  This
1ebc0 20 69 73 20 75 73 65 64 20 62 79 20 53 45 4c 45   is used by SELE
1ebd0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  CT.**           
1ebe0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d            statem
1ebf0 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69 67  ents within trig
1ec00 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20  gers whose only 
1ec10 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20  purpose is.**   
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 74 68 65 20 73 69 64 65 2d 65 66 66 65 63    the side-effec
1ec40 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e  ts of functions.
1ec50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ec60 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1ec70 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1ec80 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
1ec90 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
1eca0 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
1ecb0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
1ecc0 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
1ecd0 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
1ece0 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
1ecf0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
1ed00 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
1ed10 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
1ed20 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
1ed30 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1ed40 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
1ed50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ed60 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
1ed70 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1ed80 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
1ed90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1eda0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1edb0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
1edc0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
1edd0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c   coded. */.  Sel
1ede0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
1edf0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
1ee00 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79  o with the query
1ee10 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
1ee20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
1ee30 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1ee40 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
1ee50 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
1ee60 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66       /* Return f
1ee70 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65  rom sqlite3Where
1ee80 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62  Begin() */.  Vdb
1ee90 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1eea0 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
1eeb0 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
1eec0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1eed0 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
1eee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1eef0 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
1ef00 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
1ef10 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
1ef20 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
1ef30 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
1ef40 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
1ef50 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
1ef60 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
1ef70 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
1ef80 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
1ef90 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
1efa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1efb0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
1efc0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
1efd0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1efe0 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
1eff0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
1f000 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
1f010 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
1f020 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
1f030 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
1f040 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1f050 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
1f060 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
1f070 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
1f080 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
1f090 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20  nt isDistinct;  
1f0a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f0b0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
1f0c0 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
1f0d0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
1f0e0 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct;          /* 
1f0f0 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  Table to use for
1f100 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
1f110 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
1f120 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
1f130 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
1f140 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
1f150 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
1f160 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20  rSortIndex;     
1f170 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e  /* Address of an
1f180 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1f190 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
1f1a0 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
1f1b0 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
1f1c0 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
1f1d0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
1f1e0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
1f1f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1f200 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1f210 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
1f220 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
1f230 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
1f240 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1f250 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64  nnection */..  d
1f260 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1f270 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62    if( p==0 || db
1f280 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
1f290 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
1f2a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
1f2b0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1f2c0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1f2d0 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
1f2e0 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
1f2f0 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  urn 1;.  memset(
1f300 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69  &sAggInfo, 0, si
1f310 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b  zeof(sAggInfo));
1f320 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ..  if( Ignorabl
1f330 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
1f340 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
1f350 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1f360 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
1f370 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
1f380 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
1f390 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1f3a0 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
1f3b0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
1f3c0 69 73 63 61 72 64 29 3b 0a 20 20 20 20 2f 2a 20  iscard);.    /* 
1f3d0 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65  If ORDER BY make
1f3e0 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
1f3f0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68  in the output th
1f400 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a  en neither does.
1f410 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20      ** DISTINCT 
1f420 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d  so it can be rem
1f430 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20  oved too. */.   
1f440 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1f450 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
1f460 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e  rderBy);.    p->
1f470 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1f480 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
1f490 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
1f4a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
1f4b0 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
1f4c0 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  , 0);.  pOrderBy
1f4d0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
1f4e0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1f4f0 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
1f500 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
1f510 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1f520 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1f530 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
1f540 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
1f550 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c   isAgg = (p->sel
1f560 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
1f570 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65  gate)!=0;.  asse
1f580 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
1f590 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
1f5a0 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
1f5b0 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
1f5c0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1f5d0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
1f5e0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
1f5f0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1f600 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
1f610 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
1f620 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
1f630 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1f640 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1f650 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1f660 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1f670 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
1f680 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
1f690 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
1f6a0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
1f6b0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1f6c0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
1f6d0 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
1f6e0 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
1f6f0 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
1f700 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
1f710 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20  nt isAggSub;..  
1f720 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
1f730 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
1f740 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ted ) continue;.
1f750 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
1f760 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
1f770 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
1f780 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
1f790 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
1f7a0 72 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62  ree refered to b
1f7b0 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65  y this, the pare
1f7c0 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63  nt select. The c
1f7d0 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20  hild select.    
1f7e0 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ** may contain e
1f7f0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20  xpression trees 
1f800 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a  of at most.    *
1f810 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  * (SQLITE_MAX_EX
1f820 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e  PR_DEPTH-Parse.n
1f830 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20  Height) height. 
1f840 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20  This is a bit.  
1f850 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72    ** more conser
1f860 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65  vative than nece
1f870 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20  ssary, but much 
1f880 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f  easier than enfo
1f890 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20  rcing.    ** an 
1f8a0 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20  exact limit..   
1f8b0 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
1f8c0 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74  nHeight += sqlit
1f8d0 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
1f8e0 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ht(p);..    /* C
1f8f0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1f900 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  he subquery can 
1f910 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
1f920 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   the parent. */.
1f930 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28      isAggSub = (
1f940 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1f950 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
1f960 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  0;.    if( flatt
1f970 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
1f980 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20  e, p, i, isAgg, 
1f990 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20  isAggSub) ){.   
1f9a0 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20     if( isAggSub 
1f9b0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67  ){.        isAgg
1f9c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
1f9d0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
1f9e0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20  Aggregate;.     
1f9f0 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b   }.      i = -1;
1fa00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fa10 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1fa20 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
1fa30 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
1fa40 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
1fa50 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1fa60 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3d 3d  m->isPopulated==
1fa70 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1fa80 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
1fa90 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
1faa0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f       pItem->isPo
1fab0 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20 20  pulated = 1;.   
1fac0 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61   }.    if( /*pPa
1fad0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64  rse->nErr ||*/ d
1fae0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1faf0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1fb00 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1fb10 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
1fb20 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
1fb30 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
1fb40 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  );.    pTabList 
1fb50 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
1fb60 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
1fb70 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
1fb80 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
1fb90 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
1fba0 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
1fbb0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
1fbc0 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
1fbd0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
1fbe0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1fbf0 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
1fc00 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
1fc10 44 69 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73  Distinct = (p->s
1fc20 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1fc30 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e  tinct)!=0;..#ifn
1fc40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fc50 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
1fc60 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1fc70 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
1fc80 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
1fc90 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
1fca0 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
1fcb0 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1fcc0 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
1fcd0 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  most==0 ){.     
1fce0 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20   Select *pLoop, 
1fcf0 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  *pRight = 0;.   
1fd00 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
1fd10 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65        int mxSele
1fd20 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c  ct;.      for(pL
1fd30 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
1fd40 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
1fd50 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20  r, cnt++){.     
1fd60 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74     pLoop->pRight
1fd70 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  most = p;.      
1fd80 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d    pLoop->pNext =
1fd90 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
1fda0 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b   pRight = pLoop;
1fdb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1fdc0 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c  xSelect = db->aL
1fdd0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
1fde0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1fdf0 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  T];.      if( mx
1fe00 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78  Select && cnt>mx
1fe10 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
1fe20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1fe30 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
1fe40 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d  any terms in com
1fe50 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a  pound SELECT");.
1fe60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1fe70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fe80 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
1fe90 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1fea0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 23 65  , pDest);.  }.#e
1feb0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 72  ndif..  /* If wr
1fec0 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
1fed0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
1fee0 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
1fef0 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
1ff00 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
1ff10 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1ff20 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1ff30 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
1ff40 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
1ff50 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
1ff60 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
1ff70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
1ff80 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
1ff90 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f  ndif..  /* If po
1ffa0 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20  ssible, rewrite 
1ffb0 74 68 65 20 71 75 65 72 79 20 74 6f 20 75 73 65  the query to use
1ffc0 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61   GROUP BY instea
1ffd0 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20  d of DISTINCT.. 
1ffe0 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 69 67   ** GROUP BY mig
1fff0 68 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2c  ht use an index,
20000 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65 72 20   DISTINCT never 
20010 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  does..  */.  ass
20020 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
20030 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c  ==0 || (p->selFl
20040 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
20050 74 65 29 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  te)!=0 );.  if( 
20060 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
20070 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
20080 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
20090 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70  istinct ){.    p
200a0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
200b0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
200c0 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30  db, p->pEList, 0
200d0 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  );.    pGroupBy 
200e0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
200f0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
20100 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
20110 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d      isDistinct =
20120 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
20130 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
20140 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e   GROUP BY and an
20150 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20160 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20   and they are.  
20170 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
20180 65 6e 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f  en disable the O
20190 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
201a0 69 6e 63 65 20 74 68 65 20 47 52 4f 55 50 20 42  ince the GROUP B
201b0 59 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73  Y.  ** will caus
201c0 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f  e elements to co
201d0 6d 65 20 6f 75 74 20 69 6e 20 74 68 65 20 63 6f  me out in the co
201e0 72 72 65 63 74 20 6f 72 64 65 72 2e 20 20 54 68  rrect order.  Th
201f0 69 73 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70  is is.  ** an op
20200 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65  timization - the
20210 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
20220 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65  should result re
20230 67 61 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55  gardless..  ** U
20240 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72  se the SQLITE_Gr
20250 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20  oupByOrder flag 
20260 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
20270 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20  CTRL_OPTIMIZER. 
20280 20 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65 20 74   ** to disable t
20290 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
202a0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
202b0 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  poses..  */.  if
202c0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
202d0 74 43 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f  tCompare(p->pGro
202e0 75 70 42 79 2c 20 70 4f 72 64 65 72 42 79 29 3d  upBy, pOrderBy)=
202f0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
20300 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
20310 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29  TE_GroupByOrder)
20320 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 72 64 65  ==0 ){.    pOrde
20330 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
20340 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
20350 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
20360 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72  e, then this sor
20370 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
20380 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
20390 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
203a0 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20   data can be .  
203b0 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  ** extracted in 
203c0 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
203d0 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
203e0 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
203f0 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68  .  ** OP_OpenEph
20400 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
20410 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  on will be chang
20420 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70  ed to an OP_Noop
20430 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69   once.  ** we fi
20440 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
20450 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
20460 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  is not needed.  
20470 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65  The addrSortInde
20480 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  x.  ** variable 
20490 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
204a0 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67  itate that chang
204b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
204c0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
204d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
204e0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
204f0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
20500 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
20510 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65  erBy);.    pOrde
20520 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
20530 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
20540 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
20550 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72  phm[2] = addrSor
20560 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
20570 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20580 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
20590 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205b0 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
205c0 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
205d0 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
205e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205f0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
20600 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
20610 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65  O_HANDOFF);.  }e
20620 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72  lse{.    addrSor
20630 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
20640 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
20650 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
20660 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
20670 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
20680 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
20690 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
206a0 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
206b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
206c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
206d0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
206e0 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73  st->iParm, pELis
206f0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
20700 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
20710 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e  iter..  */.  iEn
20720 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
20730 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
20740 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
20750 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
20760 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  iEnd);..  /* Ope
20770 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
20780 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
20790 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
207a0 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74   */.  if( isDist
207b0 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49  inct ){.    KeyI
207c0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
207d0 20 20 20 61 73 73 65 72 74 28 20 69 73 41 67 67     assert( isAgg
207e0 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a   || pGroupBy );.
207f0 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70      distinct = p
20800 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
20810 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
20820 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
20830 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
20840 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
20850 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
20860 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
20870 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c   distinct, 0, 0,
20880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20890 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
208a0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
208b0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
208c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
208d0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
208e0 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61    /* Aggregate a
208f0 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  nd non-aggregate
20900 20 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e   queries are han
20910 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
20920 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67   */.  if( !isAgg
20930 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
20940 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
20950 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61  ase is for non-a
20960 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
20970 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68  .    ** Begin th
20980 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a  e database scan.
20990 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66      */.    pWInf
209a0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
209b0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
209c0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
209d0 26 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20  &pOrderBy, 0);. 
209e0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
209f0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
20a00 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  nd;..    /* If s
20a10 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
20a20 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
20a30 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
20a40 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
20a50 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
20a60 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
20a70 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
20a80 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
20a90 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
20aa0 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
20ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20ac0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
20ad0 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
20ae0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20af0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
20b00 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
20b10 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  ex, 1);.      p-
20b20 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
20b30 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
20b40 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
20b50 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
20b60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
20b70 72 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b  rt(!isDistinct);
20b80 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  .    selectInner
20b90 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
20ba0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
20bb0 72 64 65 72 42 79 2c 20 2d 31 2c 20 70 44 65 73  rderBy, -1, pDes
20bc0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
20bd0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69         pWInfo->i
20be0 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f  Continue, pWInfo
20bf0 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20  ->iBreak);..    
20c00 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
20c10 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
20c20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
20c30 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
20c40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20c50 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70  /* This is the p
20c60 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
20c70 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
20c80 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
20c90 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
20ca0 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
20cb0 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
20cc0 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
20cd0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
20ce0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
20cf0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
20d00 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
20d10 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
20d20 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
20d30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
20d40 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
20d50 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
20d60 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
20d70 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
20d80 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
20d90 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
20da0 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
20db0 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
20dc0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
20dd0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
20de0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
20df0 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
20e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e10 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
20e20 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
20e30 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
20e40 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
20e50 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
20e60 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
20e70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
20e80 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
20e90 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
20ea0 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
20eb0 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
20ec0 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
20ed0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
20ee0 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
20ef0 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20   SELECT */..    
20f00 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e  /* Remove any an
20f10 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65  d all aliases be
20f20 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74  tween the result
20f30 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20   set and the.   
20f40 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61   ** GROUP BY cla
20f50 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
20f60 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
20f70 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
20f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f90 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
20fa0 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  ter */.      str
20fb0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
20fc0 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f  m *pItem;  /* Fo
20fd0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
20fe0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c  xpression in a l
20ff0 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  ist */..      fo
21000 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r(k=p->pEList->n
21010 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70  Expr, pItem=p->p
21020 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  EList->a; k>0; k
21030 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
21040 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c        pItem->iAl
21050 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
21060 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
21070 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
21080 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
21090 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
210a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
210b0 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  em->iAlias = 0;.
210c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
210d0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
210e0 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
210f0 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  o when we want t
21100 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72  o abort the quer
21110 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64  y */.    addrEnd
21120 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
21130 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
21140 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43   /* Convert TK_C
21150 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f  OLUMN nodes into
21160 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61   TK_AGG_COLUMN a
21170 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20  nd make entries 
21180 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e  in.    ** sAggIn
21190 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47  fo for all TK_AG
211a0 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
211b0 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
211c0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  of the.    ** SE
211d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
211e0 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
211f0 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
21200 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
21210 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
21220 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
21230 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
21240 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20     sNC.pAggInfo 
21250 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
21260 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
21270 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
21280 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
21290 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20  nExpr+1 : 0;.   
212a0 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
212b0 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
212c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
212d0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
212e0 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  C, pEList);.    
212f0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
21300 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
21310 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
21320 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
21330 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
21340 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
21350 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
21360 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
21370 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
21380 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
21390 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
213a0 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
213b0 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
213c0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
213d0 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66  Property(sAggInf
213e0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
213f0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
21400 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21410 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
21420 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
21430 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
21440 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
21450 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
21460 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
21470 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
21480 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
21490 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
214a0 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
214b0 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
214c0 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
214d0 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
214e0 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  n aggregates wit
214f0 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e  hout a GROUP BY.
21500 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21510 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
21520 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
21530 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20  nfo;  /* Keying 
21540 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
21550 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61  the group by cla
21560 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
21570 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
21580 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61   /* A-vs-B compa
21590 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20  rision jump */. 
215a0 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74       int addrOut
215b0 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72  putRow;  /* Star
215c0 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  t of subroutine 
215d0 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72  that outputs a r
215e0 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20  esult row */.   
215f0 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74     int regOutput
21600 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e  Row;   /* Return
21610 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
21620 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62  r for output sub
21630 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
21640 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72   int addrSetAbor
21650 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  t;   /* Set the 
21660 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72  abort flag and r
21670 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69  eturn */.      i
21680 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  nt addrTopOfLoop
21690 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65  ;  /* Top of the
216a0 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20   input loop */. 
216b0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72       int addrSor
216c0 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20  tingIdx; /* The 
216d0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
216e0 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67   for the sorting
216f0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
21700 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20  int addrReset;  
21710 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
21720 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20  e for resetting 
21730 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
21740 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
21750 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  Reset;       /* 
21760 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
21770 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65  egister for rese
21780 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
21790 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
217a0 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59  re is a GROUP BY
217b0 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74   clause we might
217c0 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20   need a sorting 
217d0 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a  index to.      *
217e0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20  * implement it. 
217f0 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73   Allocate that s
21800 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77  orting index now
21810 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f  .  If it turns o
21820 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ut.      ** that
21830 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
21840 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68  it after all, th
21850 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  e OpenEphemeral 
21860 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20  instruction.    
21870 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e    ** will be con
21880 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f  verted into a No
21890 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20  op.  .      */. 
218a0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
218b0 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73  rtingIdx = pPars
218c0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
218d0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
218e0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
218f0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
21900 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
21910 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
21920 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
21930 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
21940 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
21950 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
21960 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
21970 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
21980 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
21990 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
219a0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20  NFO_HANDOFF);.. 
219b0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
219c0 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ze memory locati
219d0 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55  ons used by GROU
219e0 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70  P BY aggregate p
219f0 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
21a00 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61  */.      iUseFla
21a10 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
21a20 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74  em;.      iAbort
21a30 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
21a40 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
21a50 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50  OutputRow = ++pP
21a60 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
21a70 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
21a80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
21a90 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
21aa0 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50   regReset = ++pP
21ab0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
21ac0 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
21ad0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21ae0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d  el(v);.      iAM
21af0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
21b00 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
21b10 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
21b20 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
21b30 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72      iBMem = pPar
21b40 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
21b50 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
21b60 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
21b70 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
21b80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21b90 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
21ba0 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
21bb0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
21bc0 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66  , "clear abort f
21bd0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
21be0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21bf0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
21c00 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
21c10 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
21c20 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63  v, "indicate acc
21c30 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29  umulator empty")
21c40 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67  );..      /* Beg
21c50 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  in a loop that w
21c60 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20  ill extract all 
21c70 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47  source rows in G
21c80 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20  ROUP BY order.. 
21c90 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
21ca0 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73  ht involve two s
21cb0 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69  eparate loops wi
21cc0 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e  th an OP_Sort in
21cd0 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20   between, or.   
21ce0 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
21cf0 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20  e a single loop 
21d00 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
21d10 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ex to extract in
21d20 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20  formation.      
21d30 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ** in the right 
21d40 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77  order to begin w
21d50 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ith..      */.  
21d60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21d70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
21d80 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
21d90 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
21da0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
21db0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
21dc0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
21dd0 72 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30  re, &pGroupBy, 0
21de0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
21df0 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
21e00 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
21e10 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
21e20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
21e30 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61  e optimizer is a
21e40 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72  ble to deliver r
21e50 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20  ows in group by 
21e60 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20  order so.       
21e70 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   ** we do not ha
21e80 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65  ve to sort.  The
21e90 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
21ea0 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
21eb0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
21ec0 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
21ed0 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
21ee0 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
21ef0 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
21f00 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
21f10 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
21f20 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
21f30 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
21f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
21f50 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
21f60 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
21f70 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
21f80 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
21f90 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
21fa0 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
21fb0 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
21fc0 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
21fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
21fe0 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
21ff0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
22000 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
22010 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
22020 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
22030 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
22040 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73        int regBas
22050 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e;.        int r
22060 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20  egRecord;.      
22070 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
22080 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79      int nGroupBy
22090 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  ;..        group
220a0 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  BySort = 1;.    
220b0 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70      nGroupBy = p
220c0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
220d0 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e          nCol = n
220e0 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20  GroupBy + 1;.   
220f0 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
22100 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  y+1;.        for
22110 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
22120 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
22130 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41            if( sA
22140 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69  ggInfo.aCol[i].i
22150 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
22160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
22170 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Col++;.         
22180 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
22190 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
221a0 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
221b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
221c0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
221d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
221e0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
221f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
22200 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
22210 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
22220 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42  , pGroupBy, regB
22230 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ase, 0);.       
22240 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22250 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
22260 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
22270 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e  ingIdx,regBase+n
22280 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
22290 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
222a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
222b0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
222c0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
222d0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
222e0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
222f0 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
22300 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
22310 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
22320 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
22330 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
22340 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20  = j + regBase;. 
22350 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
22360 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  2;..            
22370 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
22380 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
22390 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
223c0 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pCol->iColumn,
223d0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72   pCol->iTable, r
223e0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
223f0 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20  if( r1!=r2 ){.  
22400 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
22410 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22420 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72   OP_SCopy, r2, r
22430 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
22440 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  }.            j+
22450 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
22460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22470 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
22480 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
22490 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
224a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
224b0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
224c0 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
224d0 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
224e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
224f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
22500 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  dxInsert, sAggIn
22510 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72  fo.sortingIdx, r
22520 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
22530 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
22540 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
22550 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
22560 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
22570 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
22580 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
22590 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
225a0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
225b0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nfo);.        sq
225c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
225d0 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67  v, OP_Sort, sAgg
225e0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
225f0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
22600 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22610 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
22620 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41  t"));.        sA
22630 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
22640 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
22650 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
22660 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
22670 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
22680 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
22690 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
226a0 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
226b0 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
226c0 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
226d0 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
226e0 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
226f0 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
22700 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
22710 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
22720 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
22730 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
22740 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
22750 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
22760 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
22770 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
22780 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
22790 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
227a0 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
227b0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
227c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
227d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
227e0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
227f0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  e);.      for(j=
22800 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
22810 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
22820 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
22830 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
22840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22850 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
22860 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
22870 67 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a  gIdx, j, iBMem+j
22880 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
22890 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
228a0 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
228b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
228c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
228d0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
228e0 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d  >a[j].pExpr, iBM
228f0 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
22900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
22920 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
22930 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47  iAMem, iBMem, pG
22940 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20  roupBy->nExpr,. 
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22960 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
22970 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
22980 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20  INFO);.      j1 
22990 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
229a0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
229b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
229c0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
229d0 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b   j1+1, 0, j1+1);
229e0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
229f0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
22a00 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
22a10 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
22a20 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
22a30 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  es in the GROUP 
22a40 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
22a50 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
22a60 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
22a70 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
22a80 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
22a90 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
22aa0 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
22ab0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
22ac0 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
22ad0 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
22ae0 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
22af0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
22b00 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
22b10 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
22b20 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
22b30 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
22b40 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
22b50 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
22b60 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
22b70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
22b80 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
22b90 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
22ba0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
22bb0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
22bc0 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20  (pParse, iBMem, 
22bd0 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iAMem, pGroupBy-
22be0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >nExpr);.      s
22bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22c00 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
22c10 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
22c20 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
22c30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22c40 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
22c50 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
22c60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22c70 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
22c80 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
22c90 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
22ca0 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
22cb0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
22cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22cd0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
22ce0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
22cf0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
22d00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
22d10 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
22d20 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
22d30 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
22d40 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
22d50 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
22d60 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
22d70 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
22d80 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
22d90 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
22da0 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
22db0 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
22dc0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
22dd0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
22de0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22df0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
22e00 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
22e10 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22e20 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61  (v, "indicate da
22e30 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f  ta in accumulato
22e40 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
22e50 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  End of the loop.
22e60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
22e70 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
22e80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22e90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22ea0 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  P_Next, sAggInfo
22eb0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
22ec0 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
22ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22ee0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
22ef0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
22f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
22f10 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
22f20 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29  drSortingIdx, 1)
22f30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
22f40 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
22f50 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
22f60 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
22f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22f80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
22f90 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
22fa0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
22fb0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
22fc0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
22fd0 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
22fe0 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
22ff0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
23000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
23010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23020 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
23030 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
23040 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
23050 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
23060 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
23070 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
23080 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
23090 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
230a0 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
230b0 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
230c0 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
230d0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
230e0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
230f0 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
23100 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
23110 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
23120 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
23130 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
23140 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
23150 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
23160 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
23170 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
23180 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
23190 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
231a0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
231b0 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
231c0 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
231d0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
231e0 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
231f0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
23200 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
23210 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23220 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
23230 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
23240 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
23250 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
23260 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
23270 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
23280 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
23290 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
232a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
232b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
232c0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
232d0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
232e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
232f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
23300 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23310 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
23320 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
23330 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
23340 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
23350 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
23360 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
23370 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
23380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23390 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
233a0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
233b0 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
233c0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
233d0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
233e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
233f0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
23400 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
23410 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
23420 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
23430 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
23440 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
23450 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20  , p->pEList, 0, 
23460 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  0, pOrderBy,.   
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65     distinct, pDe
23490 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
234a0 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
234b0 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
234c0 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  etAbort);.      
234d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
234e0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
234f0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
23500 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
23510 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
23520 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
23530 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
23540 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
23550 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
23560 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
23570 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
23580 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
23590 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
235a0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65  eLabel(v, addrRe
235b0 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65  set);.      rese
235c0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
235d0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
235e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
235f0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
23600 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
23610 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  ;.     .    } /*
23620 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e   endif pGroupBy.
23630 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74    Begin aggregat
23640 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  e queries withou
23650 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20  t GROUP BY: */. 
23660 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
23670 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d  ExprList *pDel =
23680 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
23690 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
236a0 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
236b0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
236c0 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
236d0 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
236e0 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
236f0 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
23700 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
23710 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
23720 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
23730 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
23740 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
23750 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
23760 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
23770 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
23780 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
23790 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
237a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
237b0 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
237c0 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
237d0 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
237e0 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
237f0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
23800 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
23810 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
23820 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
23830 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
23840 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
23850 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
23860 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
23870 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
23880 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
23890 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
238a0 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
238b0 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
238c0 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
238d0 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
238e0 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
238f0 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
23900 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
23910 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
23920 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
23930 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
23940 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
23950 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
23960 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
23970 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
23980 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
23990 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
239a0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
239b0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
239c0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
239d0 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
239e0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
239f0 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
23a00 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
23a10 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a30 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
23a40 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
23a50 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
23a60 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
23a70 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
23a80 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
23a90 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
23aa0 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
23ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23ac0 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
23ad0 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
23ae0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
23af0 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
23b00 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
23b10 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
23b20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
23b30 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
23b40 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
23b50 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
23b60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23b70 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
23b80 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
23b90 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
23ba0 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
23bb0 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
23bc0 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
23bd0 65 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f  e least amount o
23be0 66 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20  f columns. If.  
23bf0 20 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69        ** there i
23c00 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c  s such an index,
23c10 20 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73   and it has less
23c20 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68   columns than th
23c30 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  e table.        
23c40 2a 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65  ** does, then we
23c50 20 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74   can assume that
23c60 20 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73   it consumes les
23c70 73 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20  s space on disk 
23c80 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  and.        ** w
23c90 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65  ill therefore be
23ca0 20 63 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e   cheaper to scan
23cb0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
23cc0 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a  e query result..
23cd0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
23ce0 69 73 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f  is case set iRoo
23cf0 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
23d00 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
23d10 20 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20   index b-tree.  
23d20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65        ** and pKe
23d30 79 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79  yInfo to the Key
23d40 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 72  Info structure r
23d50 65 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67  equired to navig
23d60 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  ate the.        
23d70 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ** index..      
23d80 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
23d90 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
23da0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
23db0 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
23dc0 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
23dd0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
23de0 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
23df0 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
23e00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23e10 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
23e20 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
23e30 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
23e40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
23e50 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e 43  Best || pIdx->nC
23e60 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f  olumn<pBest->nCo
23e70 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
23e80 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
23e90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23eb0 69 66 28 20 70 42 65 73 74 20 26 26 20 70 42 65  if( pBest && pBe
23ec0 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62  st->nColumn<pTab
23ed0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
23ee0 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73      iRoot = pBes
23ef0 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  t->tnum;.       
23f00 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
23f10 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
23f20 6f 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  o(pParse, pBest)
23f30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
23f40 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
23f50 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
23f60 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
23f70 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
23f80 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
23f90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23fa0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
23fb0 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
23fc0 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  t, iDb);.       
23fd0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
23fe0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23ff0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
24000 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
24010 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
24020 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
24030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
24040 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24050 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43  (v, OP_Count, iC
24060 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  sr, sAggInfo.aFu
24070 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  nc[0].iMem);.   
24080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24090 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
240a0 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20  se, iCsr);.     
240b0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
240c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
240d0 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
240e0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
240f0 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
24100 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
24110 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
24120 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
24130 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
24140 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
24150 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
24160 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
24170 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
24180 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
24190 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
241a0 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
241b0 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
241c0 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
241d0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
241e0 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
241f0 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
24200 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
24210 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
24220 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
24230 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
24240 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
24250 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
24260 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
24270 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
24280 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
24290 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
242a0 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
242b0 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
242c0 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
242d0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
242e0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
242f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
24300 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
24310 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
24320 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
24330 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
24340 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
24350 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
24360 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
24370 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
24380 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
24390 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
243a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
243b0 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
243c0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
243d0 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20 66  y behaviour as f
243e0 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20  ollows:.        
243f0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
24400 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  + If the query i
24410 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  s a "SELECT min(
24420 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  x)", then the lo
24430 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20  op coded by.    
24440 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65      **     where
24450 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74  .c should not it
24460 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76  erate over any v
24470 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c  alues with a NUL
24480 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  L value.        
24490 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20  **     for x..  
244a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
244b0 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69   **   + The opti
244c0 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68  mizer code in wh
244d0 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67  ere.c (the thing
244e0 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68   that decides wh
244f0 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ich.        **  
24500 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69     index or indi
24510 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75  ces to use) shou
24520 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65  ld place a diffe
24530 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e  rent priority on
24540 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20   .        **    
24550 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20   satisfying the 
24560 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73  'ORDER BY' claus
24570 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69  e than it does i
24580 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20  n other cases.. 
24590 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65         **     Re
245a0 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20  fer to code and 
245b0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72  comments in wher
245c0 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  e.c for details.
245d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
245e0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d      ExprList *pM
245f0 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  inMax = 0;.     
24600 20 20 20 75 38 20 66 6c 61 67 20 3d 20 6d 69 6e     u8 flag = min
24610 4d 61 78 51 75 65 72 79 28 70 29 3b 0a 20 20 20  MaxQuery(p);.   
24620 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b       if( flag ){
24630 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
24640 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
24650 72 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rty(p->pEList->a
24660 5b 30 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [0].pExpr, EP_xI
24670 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
24680 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
24690 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
246a0 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
246b0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e  ->a[0].pExpr->x.
246c0 70 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20  pList,0);.      
246d0 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d      pDel = pMinM
246e0 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ax;.          if
246f0 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62  ( pMinMax && !db
24700 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
24710 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  {.            pM
24720 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74  inMax->a[0].sort
24730 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48  Order = flag!=WH
24740 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
24750 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20  ?1:0;.          
24760 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
24770 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
24780 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
24790 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a   }.        }.  .
247a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
247b0 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65  case runs if the
247c0 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e   aggregate has n
247d0 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
247e0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
247f0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
24800 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
24810 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
24820 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
24830 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74         ** of out
24840 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  put..        */.
24850 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63          resetAcc
24860 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
24870 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
24880 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
24890 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
248a0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
248b0 2c 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d  , pWhere, &pMinM
248c0 61 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20  ax, flag);.     
248d0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
248e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
248f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
24900 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
24910 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
24920 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
24930 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61    }.        upda
24940 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
24950 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
24960 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
24970 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29  MinMax && flag )
24980 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
24990 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
249a0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49   OP_Goto, 0, pWI
249b0 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20  nfo->iBreak);.  
249c0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
249d0 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
249e0 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20   index",.       
249f0 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d           (flag==
24a00 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
24a10 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
24a20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24a30 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
24a40 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
24a50 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
24a60 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
24a70 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
24a80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72      }..      pOr
24a90 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
24aa0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
24ab0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
24ac0 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51  ing, addrEnd, SQ
24ad0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
24ae0 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
24af0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
24b00 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
24b10 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20   0, 0, -1, .    
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b30 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64    pDest, addrEnd
24b40 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
24b50 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
24b60 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
24b70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
24b80 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
24b90 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29  abel(v, addrEnd)
24ba0 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e  ;.    .  } /* en
24bb0 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75  dif aggregate qu
24bc0 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ery */..  /* If 
24bd0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
24be0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
24bf0 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
24c00 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
24c10 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
24c20 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
24c30 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
24c40 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
24c50 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
24c60 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
24c70 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e   p, v, pEList->n
24c80 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20  Expr, pDest);.  
24c90 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  }..  /* Jump her
24ca0 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71  e to skip this q
24cb0 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
24cc0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
24cd0 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20  bel(v, iEnd);.. 
24ce0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77   /* The SELECT w
24cf0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
24d00 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65  coded.   Set the
24d10 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
24d20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  0.  ** to indica
24d30 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20  te no errors..  
24d40 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20  */.  rc = 0;..  
24d50 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
24d60 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
24d70 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
24d80 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
24d90 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
24da0 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
24db0 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
24dc0 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20  lect_end:..  /* 
24dd0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
24de0 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73  names if results
24df0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61   of the SELECT a
24e00 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  re to be output.
24e10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
24e20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65  SQLITE_OK && pDe
24e30 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
24e40 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
24e50 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
24e60 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
24e70 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
24e80 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
24e90 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  (db, sAggInfo.aC
24ea0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ol);.  sqlite3Db
24eb0 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
24ec0 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75  o.aFunc);.  retu
24ed0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65  rn rc;.}..#if de
24ee0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
24ef0 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  UG)./*.*********
24f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f40 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ******.** The fo
24f50 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20  llowing code is 
24f60 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
24f70 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
24f80 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a  nly.  The code.*
24f90 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64  * that follows d
24fa0 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
24fb0 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e  n normal builds.
24fc0 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
24fd0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
24fe0 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20  o print out the 
24ff0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f  content of all o
25000 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20  r part of a .** 
25010 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65 73  parse structures
25020 20 73 75 63 68 20 61 73 20 53 65 6c 65 63 74 20   such as Select 
25030 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68 20 70  or Expr.  Such p
25040 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65  rintouts are use
25050 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69  ful.** for helpi
25060 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64  ng to understand
25070 20 77 68 61 74 20 69 73 20 68 61 70 70 65 6e 69   what is happeni
25080 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f  ng inside the co
25090 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
250a0 64 75 72 69 6e 67 20 74 68 65 20 65 78 65 63 75  during the execu
250b0 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20  tion of complex 
250c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
250d0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  s..**.** These r
250e0 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63  outine are not c
250f0 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66  alled anywhere f
25100 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e  rom within the n
25110 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61  ormal.** code ba
25120 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e  se.  Then are in
25130 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c  tended to be cal
25140 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
25150 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20  the debugger.** 
25160 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72  or from temporar
25170 79 20 22 70 72 69 6e 74 66 22 20 73 74 61 74 65  y "printf" state
25180 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66  ments inserted f
25190 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f  or debugging..*/
251a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
251b0 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b  ntExpr(Expr *p){
251c0 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
251d0 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
251e0 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
251f0 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 73 71  zToken ){.    sq
25200 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25210 28 22 28 25 73 22 2c 20 70 2d 3e 75 2e 7a 54 6f  ("(%s", p->u.zTo
25220 6b 65 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ken);.  }else{. 
25230 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25240 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e  rintf("(%d", p->
25250 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  op);.  }.  if( p
25260 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73  ->pLeft ){.    s
25270 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25280 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  f(" ");.    sqli
25290 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e  te3PrintExpr(p->
252a0 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66  pLeft);.  }.  if
252b0 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  ( p->pRight ){. 
252c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
252d0 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20  rintf(" ");.    
252e0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
252f0 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  (p->pRight);.  }
25300 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
25310 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f  rintf(")");.}.vo
25320 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45  id sqlite3PrintE
25330 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
25340 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
25350 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
25360 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
25370 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  +){.    sqlite3P
25380 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  rintExpr(pList->
25390 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
253a0 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45   if( i<pList->nE
253b0 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73  xpr-1 ){.      s
253c0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
253d0 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20  f(", ");.    }. 
253e0 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
253f0 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c  3PrintSelect(Sel
25400 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65  ect *p, int inde
25410 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65  nt){.  sqlite3De
25420 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45  bugPrintf("%*sSE
25430 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65  LECT(%p) ", inde
25440 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71  nt, "", p);.  sq
25450 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
25460 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  st(p->pEList);. 
25470 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25480 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28  ntf("\n");.  if(
25490 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20   p->pSrc ){.    
254a0 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20  char *zPrefix;. 
254b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50     int i;.    zP
254c0 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a  refix = "FROM";.
254d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
254e0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  ->pSrc->nSrc; i+
254f0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
25500 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25510 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d  Item = &p->pSrc-
25520 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c  >a[i];.      sql
25530 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25540 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36  "%*s ", indent+6
25550 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20  , zPrefix);.    
25560 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a    zPrefix = "";.
25570 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
25580 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
25590 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
255a0 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20  Printf("(\n");. 
255b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72         sqlite3Pr
255c0 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d  intSelect(pItem-
255d0 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74  >pSelect, indent
255e0 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  +10);.        sq
255f0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25600 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b  ("%*s)", indent+
25610 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65  8, "");.      }e
25620 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  lse if( pItem->z
25630 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
25640 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25650 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  tf("%s", pItem->
25660 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
25670 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
25680 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  >pTab ){.       
25690 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
256a0 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29  ntf("(table: %s)
256b0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
256c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
256d0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
256e0 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
256f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25700 72 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20  rintf(" AS %s", 
25710 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
25720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25730 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  ( i<p->pSrc->nSr
25740 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  c-1 ){.        s
25750 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25760 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a  f(",");.      }.
25770 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25780 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
25790 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
257a0 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  p->pWhere ){.   
257b0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
257c0 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22  ntf("%*s WHERE "
257d0 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
257e0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
257f0 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  xpr(p->pWhere);.
25800 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25810 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
25820 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  }.  if( p->pGrou
25830 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
25840 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
25850 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69  *s GROUP BY ", i
25860 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
25870 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
25880 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
25890 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
258a0 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
258b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48  .  }.  if( p->pH
258c0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c  aving ){.    sql
258d0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
258e0 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69  "%*s HAVING ", i
258f0 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
25900 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
25910 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  (p->pHaving);.  
25920 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25930 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
25940 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
25950 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
25960 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
25970 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64   ORDER BY ", ind
25980 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
25990 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
259a0 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  st(p->pOrderBy);
259b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
259c0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
259d0 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74   }.}./* End of t
259e0 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62  he structure deb
259f0 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65  ug printing code
25a00 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
25a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
25a50 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
25a60 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
25a70 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
25a80 5f 44 45 42 55 47 29 20 2a 2f 0a                 _DEBUG) */.