/ Hex Artifact Content
Login

Artifact 2f9ed7482e7a25b0b127fc41693bbdbe1caf5647:


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 54 68   -1;.}../*.** Th
1660: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1670: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
1680: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
1690: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
16a0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
16b0: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
16c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
16d0: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
16e0: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
16f0: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
1700: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
1710: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1720: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
1730: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
1740: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
1750: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
1760: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
1770: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
1780: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
1790: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
17a0: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
17b0: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
17c0: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
17d0: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
17e0: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
17f0: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1800: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
1810: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1820: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1830: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1840: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1870: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
1880: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 72 63 2c  e */.  int iSrc,
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18b0: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
18c0: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
18d0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
18e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18f0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1900: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
1910: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1920: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
1930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1940: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
1950: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
1960: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
1970: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
1980: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1990: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
19a0: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
19b0: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
19c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
19d0: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
19e0: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
19f0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
1a00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1a10: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
1a20: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
1a30: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
1a40: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 28 69  t( pSrc->nSrc>(i
1a50: 53 72 63 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  Src+1) );.  asse
1a60: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 53 72 63  rt( pSrc->a[iSrc
1a70: 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65  ].pTab );.  asse
1a80: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 53 72 63  rt( pSrc->a[iSrc
1a90: 2b 31 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70  +1].pTab );..  p
1aa0: 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  E1 = sqlite3Crea
1ab0: 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c  teColumnExpr(db,
1ac0: 20 70 53 72 63 2c 20 69 53 72 63 2c 20 69 43 6f   pSrc, iSrc, iCo
1ad0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
1ae0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
1af0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
1b00: 2c 20 69 53 72 63 2b 31 2c 20 69 43 6f 6c 52 69  , iSrc+1, iColRi
1b10: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
1b20: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1b30: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
1b40: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
1b50: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
1b60: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
1b70: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
1b80: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
1b90: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ba0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 71 2c  AnyProperty(pEq,
1bb0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
1bc0: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
1bd0: 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69   ExprSetIrreduci
1be0: 62 6c 65 28 70 45 71 29 3b 0a 20 20 20 20 70 45  ble(pEq);.    pE
1bf0: 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  q->iRightJoinTab
1c00: 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69  le = (i16)pE2->i
1c10: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70  Table;.  }.  *pp
1c20: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1c30: 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68  xprAnd(db, *ppWh
1c40: 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a  ere, pEq);.}../*
1c50: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
1c60: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
1c70: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
1c80: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
1c90: 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65  ssion..** And se
1ca0: 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68  t the Expr.iRigh
1cb0: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54  tJoinTable to iT
1cc0: 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74  able for every t
1cd0: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  erm in the.** ex
1ce0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
1cf0: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
1d00: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
1d10: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
1d20: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
1d30: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
1d40: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
1d50: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
1d60: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
1d70: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
1d80: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
1d90: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
1da0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
1db0: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
1dc0: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
1dd0: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
1de0: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
1df0: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
1e00: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
1e10: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
1e20: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
1e30: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
1e40: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
1e50: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
1e60: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
1e70: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
1e80: 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  The Expr.iRightJ
1e90: 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74  oinTable tells t
1ea0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1eb0: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
1ec0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
1ed0: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62  n depends on tab
1ee0: 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  le iRightJoinTab
1ef0: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  le even if that 
1f00: 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  table is not.** 
1f10: 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69  explicitly menti
1f20: 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72  oned in the expr
1f30: 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e  ession.  That in
1f40: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65  formation is nee
1f50: 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73  ded.** for cases
1f60: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1f70: 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
1f80: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
1f90: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20  t2 ON t1.a=t2.b 
1fa0: 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a  AND t1.x=5.**.**
1fb0: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
1fc0: 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72  e needs to defer
1fd0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
1fe0: 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74   the t1.x=5.** t
1ff0: 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20  erm until after 
2000: 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74  the t2 loop of t
2010: 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61  he join.  In tha
2020: 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c  t way, a.** NULL
2030: 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   t2 row will be 
2040: 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65  inserted wheneve
2050: 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77  r t1.x!=5.  If w
2060: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65  e do not.** defe
2070: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2080: 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c  f t1.x=5, it wil
2090: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  l be processed i
20a0: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66  mmediately.** af
20b0: 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ter the t1 loop 
20c0: 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31  and rows with t1
20d0: 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72  .x!=5 will never
20e0: 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68   appear in.** th
20f0: 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20  e output, which 
2100: 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f  is incorrect..*/
2110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
2120: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
2130: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
2140: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2150: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2160: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
2170: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2180: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
2190: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
21a0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
21b0: 0a 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65  .    ExprSetIrre
21c0: 64 75 63 69 62 6c 65 28 70 29 3b 0a 20 20 20 20  ducible(p);.    
21d0: 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  p->iRightJoinTab
21e0: 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65  le = (i16)iTable
21f0: 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70  ;.    setJoinExp
2200: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  r(p->pLeft, iTab
2210: 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  le);.    p = p->
2220: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
2230: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2240: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
2250: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
2260: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
2270: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
2280: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
2290: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
22a0: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
22b0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
22c0: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
22d0: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
22e0: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
22f0: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
2300: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
2310: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
2320: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
2330: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
2340: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
2350: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
2360: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
2370: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
2380: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
2390: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
23a0: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
23b0: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
23c0: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
23d0: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
23e0: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
23f0: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
2400: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
2410: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
2420: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
2430: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
2440: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2450: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2460: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
2470: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
2480: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
2490: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
24a0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
24b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
24c0: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
24d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
24e0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
24f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2500: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
2510: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2530: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
2540: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
2550: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2580: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
2590: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25a0: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
25b0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
25c0: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
25d0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
25e0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
25f0: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
2600: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
2610: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
2620: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
2630: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
2640: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
2650: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
2660: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
2670: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
2680: 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62   Table *pLeftTab
2690: 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a   = pLeft->pTab;.
26a0: 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68      Table *pRigh
26b0: 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70  tTab = pRight->p
26c0: 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f  Tab;.    int isO
26d0: 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e  uter;..    if( N
26e0: 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30  EVER(pLeftTab==0
26f0: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
2700: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2710: 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69    isOuter = (pRi
2720: 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  ght->jointype & 
2730: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20  JT_OUTER)!=0;.. 
2740: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
2750: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
2760: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
2770: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2780: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
2790: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
27a0: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
27b0: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
27c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
27d0: 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  ght->jointype & 
27e0: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20  JT_NATURAL ){.  
27f0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2800: 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70  pOn || pRight->p
2810: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  Using ){.       
2820: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2830: 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55  (pParse, "a NATU
2840: 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74  RAL join may not
2850: 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20   have ".        
2860: 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49     "an ON or USI
2870: 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a  NG clause", 0);.
2880: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2890: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74  for(j=0; j<pLeft
28b0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
28c0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
28d0: 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d  Name = pLeftTab-
28e0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
28f0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
2900: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
2910: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
2920: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
2930: 66 28 20 69 52 69 67 68 74 43 6f 6c 3e 3d 30 20  f( iRightCol>=0 
2940: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
2950: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
2960: 2c 20 70 53 72 63 2c 20 69 2c 20 6a 2c 20 69 52  , pSrc, i, j, iR
2970: 69 67 68 74 43 6f 6c 2c 20 69 73 4f 75 74 65 72  ightCol, isOuter
2980: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
2990: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
29b0: 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20  isallow both ON 
29c0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
29d0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
29e0: 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  in.    */.    if
29f0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26  ( pRight->pOn &&
2a00: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2a10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2a30: 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f   "cannot have bo
2a40: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
2a50: 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73  ".        "claus
2a60: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2a70: 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  oin");.      ret
2a80: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 1;.    }..  
2a90: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20    /* Add the ON 
2aa0: 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e  clause to the en
2ab0: 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  d of the WHERE c
2ac0: 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64  lause, connected
2ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e   by.    ** an AN
2ae0: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  D operator..    
2af0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2b00: 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20  t->pOn ){.      
2b10: 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65  if( isOuter ) se
2b20: 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74  tJoinExpr(pRight
2b30: 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69  ->pOn, pRight->i
2b40: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70  Cursor);.      p
2b50: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
2b60: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
2b70: 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  ->db, p->pWhere,
2b80: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20   pRight->pOn);. 
2b90: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e       pRight->pOn
2ba0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
2bb0: 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61   /* Create extra
2bc0: 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48   terms on the WH
2bd0: 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65  ERE clause for e
2be0: 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  ach column named
2bf0: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55  .    ** in the U
2c00: 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78  SING clause.  Ex
2c10: 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77  ample: If the tw
2c20: 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  o tables to be j
2c30: 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a  oined are .    *
2c40: 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68  * A and B and th
2c50: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e  e USING clause n
2c60: 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a  ames X, Y, and Z
2c70: 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a  , then add this.
2c80: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48      ** to the WH
2c90: 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41  ERE clause:    A
2ca0: 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42  .X=B.X AND A.Y=B
2cb0: 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20  .Y AND A.Z=B.Z. 
2cc0: 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20     ** Report an 
2cd0: 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c  error if any col
2ce0: 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  umn mentioned in
2cf0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
2d00: 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  e is.    ** not 
2d10: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74  contained in bot
2d20: 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  h tables to be j
2d30: 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  oined..    */.  
2d40: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55    if( pRight->pU
2d50: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64  sing ){.      Id
2d60: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52  List *pList = pR
2d70: 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20  ight->pUsing;.  
2d80: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2d90: 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b  List->nId; j++){
2da0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2db0: 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Name = pList->a[
2dc0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2dd0: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 20 3d    int iLeftCol =
2de0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
2df0: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ftTab, zName);. 
2e00: 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67 68         int iRigh
2e10: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
2e20: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
2e30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
2e40: 28 20 69 4c 65 66 74 43 6f 6c 3c 30 20 7c 7c 20  ( iLeftCol<0 || 
2e50: 69 52 69 67 68 74 43 6f 6c 3c 30 20 29 7b 0a 20  iRightCol<0 ){. 
2e60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e70: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2e80: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
2e90: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
2ea0: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
2eb0: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
2ec0: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
2ed0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
2ee0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2ef0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f00: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
2f10: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 2c 20 69  arse, pSrc, i, i
2f20: 4c 65 66 74 43 6f 6c 2c 20 69 52 69 67 68 74 43  LeftCol, iRightC
2f30: 6f 6c 2c 20 69 73 4f 75 74 65 72 2c 20 26 70 2d  ol, isOuter, &p-
2f40: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
2f50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2f60: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2f70: 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74   Insert code int
2f80: 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20  o "v" that will 
2f90: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
2fa0: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
2fb0: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20  e.** stack into 
2fc0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73  the sorter..*/.s
2fd0: 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f  tatic void pushO
2fe0: 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72  ntoSorter(.  Par
2ff0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3000: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
3010: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
3020: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
3030: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
3040: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65  Y clause */.  Se
3050: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
3060: 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
3070: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3080: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  nt */.  int regD
3090: 61 74 61 20 20 20 20 20 20 20 20 20 20 20 20 2f  ata            /
30a0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
30b0: 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f  ng data to be so
30c0: 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  rted */.){.  Vdb
30d0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
30e0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70  Vdbe;.  int nExp
30f0: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  r = pOrderBy->nE
3100: 78 70 72 3b 0a 20 20 69 6e 74 20 72 65 67 42 61  xpr;.  int regBa
3110: 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
3120: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
3130: 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74   nExpr+2);.  int
3140: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
3150: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
3160: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
3170: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
3180: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
3190: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
31a0: 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
31b0: 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29  rBy, regBase, 0)
31c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
31d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
31e0: 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ence, pOrderBy->
31f0: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
3200: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  e+nExpr);.  sqli
3210: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
3220: 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
3230: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 31   regBase+nExpr+1
3240: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
3250: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3260: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
3270: 61 73 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20  ase, nExpr + 2, 
3280: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
3290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
32a0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
32b0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
32c0: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  sor, regRecord);
32d0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
32e0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
32f0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
3300: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
3310: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
3320: 65 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29  egBase, nExpr+2)
3330: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  ;.  if( pSelect-
3340: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69  >iLimit ){.    i
3350: 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
3360: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
3370: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
3380: 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->iOffset ){.   
3390: 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c     iLimit = pSel
33a0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a  ect->iOffset+1;.
33b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33c0: 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63   iLimit = pSelec
33d0: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d  t->iLimit;.    }
33e0: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
33f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3400: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69  , OP_IfZero, iLi
3410: 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
3420: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3430: 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74  P_AddImm, iLimit
3440: 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32  , -1);.    addr2
3450: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3460: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
3470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3480: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3490: 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
34a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34b0: 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d  _Last, pOrderBy-
34c0: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
34d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34e0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
34f0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
3500: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
3510: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3520: 61 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65 6c  addr2);.    pSel
3530: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  ect->iLimit = 0;
3540: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3550: 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  d code to implem
3560: 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a  ent the OFFSET.*
3570: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
3580: 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65  deOffset(.  Vdbe
3590: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *v,          /*
35a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
35b0: 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20  nto this VM */. 
35c0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
35d0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
35e0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
35f0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
3600: 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a  iContinue     /*
3610: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
3620: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
3630: 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ecord */.){.  if
3640: 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 26 26 20  ( p->iOffset && 
3650: 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a  iContinue!=0 ){.
3660: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
3670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3680: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
3690: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31  , p->iOffset, -1
36a0: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
36b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
36c0: 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e  v, OP_IfNeg, p->
36d0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71  iOffset);.    sq
36e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
36f0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
3700: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
3710: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
3720: 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f  skip OFFSET reco
3730: 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  rds"));.    sqli
3740: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3750: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
3760: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
3770: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
3780: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
3790: 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   N registers sta
37a0: 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a  rting at iMem.**
37b0: 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74   form a distinct
37c0: 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73   entry.  iTab is
37d0: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
37e0: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
37f0: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
3800: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
3810: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
3820: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
3830: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
3840: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
3850: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
3860: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
3870: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
3880: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
3890: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
38a0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
38b0: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
38c0: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
38d0: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
38e0: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
38f0: 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  inct(.  Parse *p
3900: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
3910: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
3920: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
3930: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  t */.  int iTab,
3940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
3950: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
3960: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
3970: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
3980: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
3990: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
39a0: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
39b0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
39c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
39d0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
39e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3a00: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
3a10: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
3a20: 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72   r1;..  v = pPar
3a30: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20  se->pVdbe;.  r1 
3a40: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
3a50: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
3a60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
3a70: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
3a80: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
3a90: 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73  t, iMem, N);.  s
3aa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3ab0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3ac0: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
3ad0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3ae0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
3af0: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b  sert, iTab, r1);
3b00: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
3b10: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
3b20: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   r1);.}../*.** G
3b30: 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72  enerate an error
3b40: 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61 20   message when a 
3b50: 53 45 4c 45 43 54 20 69 73 20 75 73 65 64 20 77  SELECT is used w
3b60: 69 74 68 69 6e 20 61 20 73 75 62 65 78 70 72 65  ithin a subexpre
3b70: 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c  ssion.** (exampl
3b80: 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43  e:  "a IN (SELEC
3b90: 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22  T * FROM table)"
3ba0: 29 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72  ) but it has mor
3bb0: 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a  e than 1 result.
3bc0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64  ** column.  We d
3bd0: 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72  o this in a subr
3be0: 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65 20 74  outine because t
3bf0: 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
3c00: 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70  in multiple.** p
3c10: 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  laces..*/.static
3c20: 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c   int checkForMul
3c30: 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
3c40: 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ror(.  Parse *pP
3c50: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
3c60: 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f  arse context. */
3c70: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
3c80: 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69  Dest,   /* Desti
3c90: 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54  nation of SELECT
3ca0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
3cb0: 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20 20  t nExpr         
3cc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3cd0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72  result columns r
3ce0: 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
3cf0: 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44  T */.){.  int eD
3d00: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
3d10: 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e  st;.  if( nExpr>
3d20: 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54  1 && (eDest==SRT
3d30: 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
3d40: 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73  RT_Set) ){.    s
3d50: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3d60: 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73  Parse, "only a s
3d70: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c  ingle result all
3d80: 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20  owed for ".     
3d90: 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74    "a SELECT that
3da0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
3db0: 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
3dc0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
3dd0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
3de0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3df0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
3e00: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
3e10: 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66  or the inside of
3e20: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
3e30: 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a  ** of a SELECT..
3e40: 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20  **.** If srcTab 
3e50: 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20  and nColumn are 
3e60: 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20  both zero, then 
3e70: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
3e80: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
3e90: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
3ea0: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
3eb0: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
3ec0: 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20  If nColumn>0.** 
3ed0: 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c  then data is pul
3ee0: 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20  led from srcTab 
3ef0: 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73  and pEList is us
3f00: 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74  ed only to get t
3f10: 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20  he.** datatypes 
3f20: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e  for each column.
3f30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3f40: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
3f50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3f60: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
3f70: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
3f80: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3fa0: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   The complete se
3fb0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62  lect statement b
3fc0: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
3fd0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
3fe0: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
3ff0: 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20  of values being 
4000: 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69  extracted */.  i
4010: 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20  nt srcTab,      
4020: 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64         /* Pull d
4030: 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ata from this ta
4040: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ble */.  int nCo
4050: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
4060: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
4070: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75  lumns in the sou
4080: 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  rce table */.  E
4090: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
40a0: 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74  y,     /* If not
40b0: 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75   NULL, sort resu
40c0: 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b  lts using this k
40d0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  ey */.  int dist
40e0: 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  inct,           
40f0: 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20  /* If >=0, make 
4100: 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65  sure results are
4110: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53   distinct */.  S
4120: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
4130: 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f  ,      /* How to
4140: 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
4150: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
4160: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20   iContinue,     
4170: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
4180: 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
4190: 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20  th next row */. 
41a0: 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
41b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
41c0: 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
41d0: 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ut of the inner 
41e0: 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  loop */.){.  Vdb
41f0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4200: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
4210: 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74   int hasDistinct
4220: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
4230: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
4240: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
4250: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ent */.  int reg
4260: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
4270: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
4280: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
4290: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
42a0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
42b0: 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48  t->eDest;   /* H
42c0: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
42d0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
42e0: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
42f0: 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72  >iParm;   /* Fir
4300: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64  st argument to d
4310: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
4320: 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43  /.  int nResultC
4330: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
4340: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
4350: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a  ult columns */..
4360: 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20    assert( v );. 
4370: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
4380: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
4390: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
43a0: 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20  ;.  hasDistinct 
43b0: 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20  = distinct>=0;. 
43c0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
43d0: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
43e0: 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   ){.    codeOffs
43f0: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4400: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
4410: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
4420: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
4430: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
4440: 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  ){.    nResultCo
4450: 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  l = nColumn;.  }
4460: 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c  else{.    nResul
4470: 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  tCol = pEList->n
4480: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Expr;.  }.  if( 
4490: 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29  pDest->iMem==0 )
44a0: 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65  {.    pDest->iMe
44b0: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
44c0: 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e  +1;.    pDest->n
44d0: 4d 65 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  Mem = nResultCol
44e0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
44f0: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
4500: 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
4510: 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 6e  assert( pDest->n
4520: 4d 65 6d 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20  Mem==nResultCol 
4530: 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73 75  );.  }.  regResu
4540: 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d  lt = pDest->iMem
4550: 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e  ;.  if( nColumn>
4560: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
4570: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
4580: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4590: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
45a0: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
45b0: 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29   i, regResult+i)
45c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
45d0: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  if( eDest!=SRT_E
45e0: 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20  xists ){.    /* 
45f0: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
4600: 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28  on is an EXISTS(
4610: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c  ...) expression,
4620: 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20   the actual.    
4630: 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  ** values return
4640: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
4650: 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65   are not require
4660: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
4670: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
4680: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
4690: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
46a0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
46b0: 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75   pEList, regResu
46c0: 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  lt, eDest==SRT_O
46d0: 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43  utput);.  }.  nC
46e0: 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43  olumn = nResultC
46f0: 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ol;..  /* If the
4700: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
4710: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
4720: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
4730: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
4740: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
4750: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
4760: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
4770: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
4780: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
4790: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
47a0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61  istinct ){.    a
47b0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
47c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
47d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e  pEList->nExpr==n
47e0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f  Column );.    co
47f0: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
4800: 65 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f  e, distinct, iCo
4810: 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c  ntinue, nColumn,
4820: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
4830: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4840: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
4850: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
4860: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
4870: 0a 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72  ..  if( checkFor
4880: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
4890: 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
48a0: 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Dest, pEList->nE
48b0: 78 70 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  xpr) ){.    retu
48c0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rn;.  }..  switc
48d0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
48e0: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
48f0: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
4900: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
4910: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
4920: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
4930: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
4940: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4950: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
4960: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
4970: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
4980: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31  int r1;.      r1
4990: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
49a0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
49b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
49c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
49d0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
49e0: 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  t, nColumn, r1);
49f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4a00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4a10: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
4a20: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
4a30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4a40: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
4a50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4a60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
4a70: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
4a80: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
4a90: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
4aa0: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
4ab0: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
4ac0: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
4ad0: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
4ae0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
4af0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
4b00: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
4b10: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
4b20: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
4b30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4b40: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
4b50: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
4b60: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
4b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4b80: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  ndif..    /* Sto
4b90: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
4ba0: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
4bb0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
4bc0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
4bd0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
4be0: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
4bf0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
4c00: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
4c10: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65  Parse);.      te
4c20: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
4c30: 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
4c40: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
4c50: 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
4c60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4c70: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4c80: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
4c90: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
4ca0: 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   r1);.      if( 
4cb0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
4cc0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4cd0: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
4ce0: 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20  rBy, p, r1);.   
4cf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d00: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
4d10: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
4d20: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
4d30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4d40: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
4d50: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
4d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4d70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
4d80: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
4d90: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
4da0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
4db0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
4dc0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4dd0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
4de0: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
4df0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4e00: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4e10: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
4e20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4e30: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4e40: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
4e50: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
4e60: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
4e70: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
4e80: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
4e90: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
4ea0: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
4eb0: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
4ec0: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
4ed0: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
4ee0: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
4ef0: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
4f00: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
4f10: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4f20: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
4f30: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
4f40: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66   );.      p->aff
4f50: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43  inity = sqlite3C
4f60: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
4f70: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
4f80: 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69  r, pDest->affini
4f90: 74 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ty);.      if( p
4fa0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
4fb0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
4fc0: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
4fd0: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
4fe0: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
4ff0: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
5000: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
5010: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
5020: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
5030: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
5040: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
5050: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
5060: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
5070: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
5080: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
5090: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
50a0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
50b0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
50c0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
50d0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
50e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
50f0: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
5100: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5110: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
5120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5130: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
5140: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
5150: 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69   1, r1, &p->affi
5160: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
5170: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
5180: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
5190: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
51a0: 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  lt, 1);.        
51b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
51c0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
51d0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
51e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
51f0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
5200: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
5210: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5220: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
5230: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
5240: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
5250: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
5260: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
5270: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
5280: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
5290: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
52a0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
52b0: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
52c0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
52d0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
52e0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
52f0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
5300: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5310: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
5320: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
5330: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
5340: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
5350: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
5360: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
5370: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
5380: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
5390: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
53a0: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
53b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
53c0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
53d0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
53e0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn==1 );.      i
53f0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
5400: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
5410: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
5420: 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65  rderBy, p, regRe
5430: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  sult);.      }el
5440: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5450: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
5460: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
5470: 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t, iParm, 1);.  
5480: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
5490: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
54a0: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
54b0: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
54c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
54d0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
54e0: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
54f0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
5500: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20  */..    /* Send 
5510: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
5520: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
5530: 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75  n or to a subrou
5540: 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20  tine.  In the.  
5550: 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73    ** case of a s
5560: 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73  ubroutine, the s
5570: 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66  ubroutine itself
5580: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5590: 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69  for.    ** poppi
55a0: 6e 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d  ng the data from
55b0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
55c0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
55d0: 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63  Coroutine:.    c
55e0: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
55f0: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
5600: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
5610: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
5620: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
5630: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
5640: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5650: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
5660: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5670: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5680: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5690: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
56a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
56b0: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
56c0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75   r1);.        pu
56d0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
56e0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
56f0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
5700: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5710: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5720: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5730: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
5740: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
5750: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5760: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
5770: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
5780: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5790: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
57a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
57b0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
57c0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
57d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
57e0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
57f0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
5800: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
5810: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5820: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
5830: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5840: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
5850: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
5860: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
5870: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
5880: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
5890: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
58a0: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
58b0: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
58c0: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
58d0: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
58e0: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
58f0: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
5900: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
5910: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
5920: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
5930: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
5940: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
5950: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
5960: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
5970: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
5980: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
5990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
59a0: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
59b0: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
59c0: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
59d0: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
59e0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
59f0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
5a00: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
5a10: 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 66 20 74 68  ==0 );  /* If th
5a20: 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
5a30: 42 59 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a  BY, the call to.
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
5a60: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
5a70: 77 6f 75 6c 64 20 68 61 76 65 20 63 6c 65 61 72  would have clear
5a80: 65 64 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  ed p->iLimit */.
5a90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5aa0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp3(v, OP_IfZe
5ab0: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
5ac0: 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a  Break, -1);.  }.
5ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5ae0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
5af0: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65  t, generate a Ke
5b00: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5b10: 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20  that records.** 
5b20: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
5b30: 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20  quence for each 
5b40: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
5b50: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  at expression li
5b60: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
5b70: 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20   ExprList is an 
5b80: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
5b90: 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e  P BY clause then
5ba0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a   the resulting.*
5bb0: 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  * KeyInfo struct
5bc0: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
5bd0: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
5be0: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ing a virtual in
5bf0: 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  dex to.** implem
5c00: 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e  ent that clause.
5c10: 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73    If the ExprLis
5c20: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
5c30: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a  set of a SELECT.
5c40: 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49  ** then the KeyI
5c50: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
5c60: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
5c70: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
5c80: 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78  virtual.** index
5c90: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
5ca0: 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a  DISTINCT test..*
5cb0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
5cc0: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
5cd0: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
5ce0: 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  in from malloc. 
5cf0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
5d00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
5d10: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
5d20: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
5d30: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
5d40: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20  ally.** freed.  
5d50: 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  Add the KeyInfo 
5d60: 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65  structure to the
5d70: 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20   P4 field of an 
5d80: 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20  opcode using.** 
5d90: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
5da0: 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c 20  FF is the usual 
5db0: 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77  way of dealing w
5dc0: 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61  ith this..*/.sta
5dd0: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
5de0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
5df0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5e00: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
5e10: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
5e20: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
5e30: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79  int nExpr;.  Key
5e40: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73  Info *pInfo;.  s
5e50: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
5e60: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
5e70: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
5e80: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
5e90: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  pInfo = sqlite3D
5ea0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
5eb0: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b  sizeof(*pInfo) +
5ec0: 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43   nExpr*(sizeof(C
5ed0: 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20  ollSeq*)+1) );. 
5ee0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
5ef0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
5f00: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66  der = (u8*)&pInf
5f10: 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  o->aColl[nExpr];
5f20: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65  .    pInfo->nFie
5f30: 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b  ld = (u16)nExpr;
5f40: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20  .    pInfo->enc 
5f50: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70  = ENC(db);.    p
5f60: 49 6e 66 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  Info->db = db;. 
5f70: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
5f80: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45  m=pList->a; i<nE
5f90: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
5fa0: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
5fb0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
5fc0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
5fd0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
5fe0: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
5ff0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
6000: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
6010: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
6020: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
6030: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
6040: 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
6050: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
6060: 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  der[i] = pItem->
6070: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
6080: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
6090: 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  nfo;.}.../*.** I
60a0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
60b0: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
60c0: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
60d0: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
60e0: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
60f0: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
6100: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
6110: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
6120: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
6130: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
6140: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
6150: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
6160: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
6170: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
6180: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
6190: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
61a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
61b0: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
61c0: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
61d0: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
61e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
61f0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
6200: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
6210: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
6220: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
6230: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
6240: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
6250: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
6260: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
6270: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
6280: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
6290: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
62a0: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
62b0: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
62c0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  ){.  int addrBre
62d0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
62e0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20  MakeLabel(v);   
62f0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
6300: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
6310: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
6320: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
6330: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
6340: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
6350: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
6360: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
6370: 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64  Tab;.  int pseud
6380: 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  oTab = 0;.  Expr
6390: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
63a0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
63b0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
63c0: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
63d0: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
63e0: 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65  iParm;..  int re
63f0: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
6400: 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20  owid;..  iTab = 
6410: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
6420: 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73  or;.  regRow = s
6430: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6440: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
6450: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
6460: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
6470: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6480: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61   pseudoTab = pPa
6490: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
64a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64b0: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
64c0: 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  udo, pseudoTab, 
64d0: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
64e0: 3b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  ;.    regRowid =
64f0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
6500: 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69   regRowid = sqli
6510: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6520: 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 61 64 64  arse);.  }.  add
6530: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
6540: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6550: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
6560: 42 72 65 61 6b 29 3b 0a 20 20 63 6f 64 65 4f 66  Break);.  codeOf
6570: 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64 72 43  fset(v, p, addrC
6580: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
6590: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
65a0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
65b0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
65c0: 72 20 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a  r + 1, regRow);.
65d0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
65e0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
65f0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
6600: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
6610: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6620: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
6630: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
6640: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
6650: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
6660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6670: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
6680: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
6690: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
66a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
66b0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
66c0: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
66d0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
66e0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
66f0: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
6700: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6710: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
6720: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6730: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
6740: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
6750: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
6760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6770: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
6780: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
6790: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
67a0: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
67b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
67c0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
67d0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
67e0: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
67f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6800: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6810: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
6820: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
6830: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6840: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
6850: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6860: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6870: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
6880: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
6890: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
68a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
68b0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
68c0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
68d0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
68e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
68f0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
6900: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
6910: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
6920: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
6930: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
6940: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
6950: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
6960: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
6970: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6980: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
6990: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
69a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
69b0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
69c0: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f 77    assert( regRow
69d0: 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20  !=pDest->iMem+i 
69e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
69f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6a00: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64  OP_Column, pseud
6a10: 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e  oTab, i, pDest->
6a20: 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20 20  iMem+i);.       
6a30: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
6a40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6a50: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
6a60: 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29  FLAG_CLEARCACHE)
6a70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6a80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44    }.      if( eD
6a90: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6aa0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6ab0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6ac0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
6ad0: 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75  est->iMem, nColu
6ae0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
6af0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
6b00: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
6b10: 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c  se, pDest->iMem,
6b20: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
6b30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6b40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6b50: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6b60: 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20  Dest->iParm);.  
6b70: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6b80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
6b90: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6ba0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
6bb0: 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Row);.  sqlite3R
6bc0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6bd0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
6be0: 0a 0a 20 20 2f 2a 20 4c 49 4d 49 54 20 68 61 73  ..  /* LIMIT has
6bf0: 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65   been implemente
6c00: 64 20 62 79 20 74 68 65 20 70 75 73 68 4f 6e 74  d by the pushOnt
6c10: 6f 53 6f 72 74 65 72 28 29 20 72 6f 75 74 69 6e  oSorter() routin
6c20: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
6c30: 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 29  ( p->iLimit==0 )
6c40: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74  ;..  /* The bott
6c50: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
6c60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
6c70: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
6c80: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
6c90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ca0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
6cb0: 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73  iTab, addr);.  s
6cc0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
6cd0: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
6ce0: 65 61 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73  eak);.  if( eDes
6cf0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
6d00: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
6d10: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c  utine ){.    sql
6d20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6d30: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75  , OP_Close, pseu
6d40: 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d  doTab, 0);.  }.}
6d50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
6d60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
6d70: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
6d80: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
6d90: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
6da0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
6db0: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
6dc0: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
6dd0: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
6de0: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ller..**.** The 
6df0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6e00: 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61   is the exact da
6e10: 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f  tatype definitio
6e20: 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  n extracted from
6e30: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
6e40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6e50: 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65  atement if the e
6e60: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
6e70: 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65  olumn. The.** de
6e80: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
6e90: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
6ea0: 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61   is INTEGER. Exa
6eb0: 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70  ctly when an exp
6ec0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  ression.** is co
6ed0: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
6ee0: 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78  n can be complex
6ef0: 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65   in the presence
6f00: 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20   of subqueries. 
6f10: 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  The.** result-se
6f20: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  t expression in 
6f30: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
6f40: 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74  wing SELECT stat
6f50: 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f  ements is .** co
6f60: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
6f70: 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  n by this functi
6f80: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  on..**.**   SELE
6f90: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
6fa0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
6fb0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
6fc0: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
6fd0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
6fe0: 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  tbl);.**   SELEC
6ff0: 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45  T abc FROM (SELE
7000: 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52  CT col AS abc FR
7010: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20  OM tbl);.** .** 
7020: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
7030: 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70  type for any exp
7040: 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68  ression other th
7050: 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e  an a column is N
7060: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
7070: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
7080: 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e  nType(.  NameCon
7090: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
70a0: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e  pr *pExpr,.  con
70b0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
70c0: 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  inDb,.  const ch
70d0: 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62  ar **pzOriginTab
70e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
70f0: 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a  *pzOriginCol.){.
7100: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
7110: 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
7120: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62  const *zOriginDb
7130: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
7140: 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d  st *zOriginTab =
7150: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
7160: 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30   *zOriginCol = 0
7170: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28  ;.  int j;.  if(
7180: 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
7190: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
71a0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
71b0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
71c0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
71d0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
71e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
71f0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
7200: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
7210: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
7220: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
7230: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
7240: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
7250: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
7260: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
7270: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
7280: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
7290: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
72a0: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
72b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
72c0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
72e0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
72f0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
7300: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
7310: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
7320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7330: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
7340: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
7350: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
7360: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
7370: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
7380: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
7390: 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ab */.      test
73a0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
73b0: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
73c0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
73d0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
73e0: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
73f0: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
7400: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
7410: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
7420: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
7430: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
7440: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
7450: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
7460: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
7470: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
7480: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
7490: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
74a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
74b0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
74c0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
74d0: 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d    pS = pTabList-
74e0: 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[j].pSelect;. 
74f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7500: 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e          pNC = pN
7510: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
7520: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
7530: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
7540: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
7550: 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73  one time, code s
7560: 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e  uch as "SELECT n
7570: 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74  ew.x" within a t
7580: 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20  rigger would.   
7590: 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
75a0: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20  is condition to 
75b0: 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e  run.  Since then
75c0: 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75  , we have restru
75d0: 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20  ctured how.     
75e0: 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f     ** trigger co
75f0: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
7600: 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64  and so this cond
7610: 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67  ition is no long
7620: 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  er .        ** p
7630: 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72  ossible. However
7640: 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62  , it can still b
7650: 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65  e true for state
7660: 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20  ments like.     
7670: 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
7680: 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing:.        **.
7690: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45          **   CRE
76a0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c  ATE TABLE t1(col
76b0: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20   INTEGER);.     
76c0: 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28     **   SELECT (
76d0: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46  SELECT t1.col) F
76e0: 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ROM FROM t1;.   
76f0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
7700: 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  ** when columnTy
7710: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
7720: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
7730: 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65   "t1.col" in the
7740: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62   .        ** sub
7750: 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73  -select. In this
7760: 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63   case, set the c
7770: 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55  olumn type to NU
7780: 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20  LL, even.       
7790: 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68   ** though it sh
77a0: 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22  ould really be "
77b0: 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20  INTEGER"..      
77c0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
77d0: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72  This is not a pr
77e0: 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f  oblem, as the co
77f0: 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31  lumn type of "t1
7800: 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20  .col" is never. 
7810: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20         ** used. 
7820: 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  When columnType(
7830: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
7840: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20  he expression . 
7850: 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45         ** "(SELE
7860: 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65  CT t1.col)", the
7870: 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73   correct type is
7880: 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74   returned (see t
7890: 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20  he TK_SELECT.   
78a0: 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62       ** branch b
78b0: 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20  elow.  */.      
78c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
78d0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
78e0: 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70  pTab && pExpr->p
78f0: 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  Tab==pTab );.   
7900: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
7910: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
7920: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
7930: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
7940: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
7950: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
7960: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
7970: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
7980: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
7990: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
79a0: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
79b0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
79c0: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
79d0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
79e0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
79f0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
7a00: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
7a10: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pS->pEList->nExp
7a20: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
7a30: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
7a40: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
7a50: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
7a60: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
7a70: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
7a80: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
7a90: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
7aa0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
7ab0: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
7ac0: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
7ad0: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
7ae0: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
7af0: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
7b00: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7b10: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
7b20: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
7b30: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
7b40: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
7b50: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
7b60: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
7b70: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
7b80: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
7b90: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
7ba0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
7bb0: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
7bc0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
7bd0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
7be0: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
7bf0: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
7c00: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
7c10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
7c20: 57 41 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65  WAYS(pTab->pSche
7c30: 6d 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ma) ){.        /
7c40: 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a  * A real table *
7c50: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
7c60: 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20  ( !pS );.       
7c70: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
7c80: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
7c90: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7ca0: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
7cb0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
7cc0: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
7cd0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
7ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
7cf0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
7d00: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
7d10: 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b  inCol = "rowid";
7d20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7d30: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
7d40: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
7d50: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
7d60: 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d      zOriginCol =
7d70: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7d80: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7d90: 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67   }.        zOrig
7da0: 69 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e  inTab = pTab->zN
7db0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
7dc0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a   pNC->pParse ){.
7dd0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
7de0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
7df0: 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50  aToIndex(pNC->pP
7e00: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
7e10: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
7e20: 20 20 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20      zOriginDb = 
7e30: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
7e40: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
7e50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7e60: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7e70: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
7e80: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7e90: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
7ea0: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
7eb0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
7ec0: 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
7ed0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
7ee0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
7ef0: 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69  d.      ** origi
7f00: 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73  n info for the s
7f10: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  ingle column in 
7f20: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
7f30: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  f the SELECT.   
7f40: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e     ** statement.
7f50: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7f60: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
7f70: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
7f80: 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  S = pExpr->x.pSe
7f90: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
7fa0: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
7fb0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
7fc0: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
7fd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
7fe0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
7ff0: 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53   );.      sNC.pS
8000: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
8010: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
8020: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
8030: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
8040: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
8050: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
8060: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
8070: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
8080: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
8090: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
80a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
80b0: 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  }.  .  if( pzOri
80c0: 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73  ginDb ){.    ass
80d0: 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62  ert( pzOriginTab
80e0: 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20   && pzOriginCol 
80f0: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  );.    *pzOrigin
8100: 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a  Db = zOriginDb;.
8110: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62      *pzOriginTab
8120: 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20   = zOriginTab;. 
8130: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20     *pzOriginCol 
8140: 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20  = zOriginCol;.  
8150: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65  }.  return zType
8160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
8170: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
8180: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
8190: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
81a0: 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   types of column
81b0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
81c0: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
81d0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
81e0: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
81f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8200: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
8210: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
8220: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
8230: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
8240: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
8250: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
8260: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
8270: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
8280: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
8290: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
82a0: 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  E.  Vdbe *v = pP
82b0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
82c0: 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
82d0: 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70  ext sNC;.  sNC.p
82e0: 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
82f0: 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  st;.  sNC.pParse
8300: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72   = pParse;.  for
8310: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
8320: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8330: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
8340: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
8350: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8360: 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Type;.#ifdef SQL
8370: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
8380: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63  N_METADATA.    c
8390: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
83a0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  Db = 0;.    cons
83b0: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62  t char *zOrigTab
83c0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
83d0: 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  char *zOrigCol =
83e0: 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   0;.    zType = 
83f0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
8400: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
8410: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
8420: 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ol);..    /* The
8430: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
8440: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
8450: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
8460: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
8470: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
8480: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
8490: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
84a0: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
84b0: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
84c0: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
84d0: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
84e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
84f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8500: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
8510: 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54  OrigDb, SQLITE_T
8520: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
8530: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8540: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8550: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
8560: 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ab, SQLITE_TRANS
8570: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
8580: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8590: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
85a0: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
85b0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
85c0: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
85d0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
85e0: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
85f0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  0);.#endif.    s
8600: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8610: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8620: 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79  ME_DECLTYPE, zTy
8630: 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  pe, SQLITE_TRANS
8640: 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  IENT);.  }.#endi
8650: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
8660: 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a  _DECLTYPE */.}..
8670: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
8680: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
8690: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
86a0: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
86b0: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
86c0: 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66  t set.  This inf
86d0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
86e0: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a   to provide the.
86f0: 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65  ** azCol[] value
8700: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
8710: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
8720: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
8730: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
8740: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
8750: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
8760: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
8770: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
8780: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
8790: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
87a0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
87b0: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
87c0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
87d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
87e0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
87f0: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
8800: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8810: 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d  b;.  int fullNam
8820: 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a  es, shortNames;.
8830: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8840: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
8850: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
8860: 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
8870: 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
8880: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
8890: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
88a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
88b0: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
88c0: 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76  esSet || NEVER(v
88d0: 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ==0) || db->mall
88e0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
88f0: 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  n;.  pParse->col
8900: 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
8910: 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d  fullNames = (db-
8920: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
8930: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
8940: 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d  ;.  shortNames =
8950: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
8960: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
8970: 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65  es)!=0;.  sqlite
8980: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
8990: 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
89a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
89b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
89c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
89d0: 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74  ;.    p = pEList
89e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
89f0: 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
8a00: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
8a10: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
8a20: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
8a30: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
8a40: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8a50: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
8a60: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8a70: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8a80: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
8a90: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
8aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
8ab0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
8ac0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43   p->op==TK_AGG_C
8ad0: 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69  OLUMN) && pTabLi
8ae0: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
8af0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
8b00: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
8b10: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
8b20: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
8b30: 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c  r(j=0; ALWAYS(j<
8b40: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  pTabList->nSrc);
8b50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
8b60: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  f( pTabList->a[j
8b70: 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54  ].iCursor==p->iT
8b80: 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  able ) break;.  
8b90: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
8ba0: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
8bb0: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
8bc0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
8bd0: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
8be0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
8bf0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
8c00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
8c10: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
8c20: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
8c30: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
8c40: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
8c50: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
8c60: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
8c70: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
8c80: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
8c90: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
8ca0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
8cb0: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
8cc0: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
8cd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8ce0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8cf0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
8d00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8d10: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c  DbStrDup(db, pEL
8d20: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
8d30: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
8d40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
8d50: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  f( fullNames ){.
8d60: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
8d70: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
8d80: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
8d90: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
8da0: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
8db0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
8dc0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8dd0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8de0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8df0: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
8e00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8e10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8e20: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8e30: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8e40: 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
8e50: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
8e60: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8e70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8e80: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8e90: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20  COLNAME_NAME, . 
8ea0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8eb0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c  DbStrDup(db, pEL
8ec0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
8ed0: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
8ee0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67  );.    }.  }.  g
8ef0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
8f00: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
8f10: 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a  ist, pEList);.}.
8f20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8f30: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
8f40: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  LECT./*.** Name 
8f50: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
8f60: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
8f70: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
8f80: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
8f90: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
8fa0: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
8fb0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
8fc0: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
8fd0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
8fe0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
8ff0: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
9000: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
9010: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
9020: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
9030: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
9040: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
9050: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9060: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
9070: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
9080: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
9090: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
90a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
90b0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
90c0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
90d0: 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70  * Given a an exp
90e0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68  ression list (wh
90f0: 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68  ich is really th
9100: 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  e list of expres
9110: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f  sions.** that fo
9120: 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  rm the result se
9130: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  t of a SELECT st
9140: 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65  atement) compute
9150: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
9160: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
9170: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f   a table that wo
9180: 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70  uld hold the exp
9190: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
91a0: 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e  .** All column n
91b0: 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69  ames will be uni
91c0: 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  que..**.** Only 
91d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
91e0: 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20   are computed.  
91f0: 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f  Column.zType, Co
9200: 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61  lumn.zColl,.** a
9210: 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
9220: 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65  of Column are ze
9230: 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  roed..**.** Retu
9240: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
9250: 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d  success.  If a m
9260: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
9270: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
9280: 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20  * store NULL in 
9290: 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20  *paCol and 0 in 
92a0: 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72  *pnCol and retur
92b0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
92c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
92d0: 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
92e0: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
92f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
9300: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9310: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
9320: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
9330: 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20     /* Expr list 
9340: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65  from which to de
9350: 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  rive column name
9360: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f  s */.  int *pnCo
9370: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
9380: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
9390: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65  er of columns he
93a0: 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  re */.  Column *
93b0: 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20  *paCol          
93c0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77  /* Write the new
93d0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72   column list her
93e0: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
93f0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9400: 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73  db;   /* Databas
9410: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9420: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9440: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
9450: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74  /* Index added t
9480: 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20  o make the name 
9490: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75  unique */.  Colu
94a0: 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
94b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
94c0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75  ooping over resu
94d0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
94e0: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9500: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9510: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
9520: 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b  et */.  Expr *p;
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
9550: 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72  n for a single r
9560: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  esult column */.
9570: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9590: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
95a0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
95c0: 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e   Size of name in
95d0: 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 2a   zName[] */..  *
95e0: 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70  pnCol = nCol = p
95f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
9600: 61 43 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d 20  aCol = *paCol = 
9610: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
9620: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61  ero(db, sizeof(a
9630: 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20  Col[0])*nCol);. 
9640: 20 69 66 28 20 61 43 6f 6c 3d 3d 30 20 29 20 72   if( aCol==0 ) r
9650: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9660: 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  EM;.  for(i=0, p
9670: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c  Col=aCol; i<nCol
9680: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
9690: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
96a0: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
96b0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
96c0: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c    */.    p = pEL
96d0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
96e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
96f0: 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 45 78 70  pRight==0 || Exp
9700: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e  rHasProperty(p->
9710: 70 52 69 67 68 74 2c 20 45 50 5f 49 6e 74 56 61  pRight, EP_IntVa
9720: 6c 75 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  lue).           
9730: 20 20 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74      || p->pRight
9740: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 20 7c 7c  ->u.zToken==0 ||
9750: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54   p->pRight->u.zT
9760: 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  oken[0]!=0 );.  
9770: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
9780: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
9790: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
97a0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
97b0: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
97c0: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
97d0: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
97e0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
97f0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
9800: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
9810: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9820: 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45       Expr *pColE
9830: 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65  xpr = p;  /* The
9840: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
9850: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63   is the result c
9860: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
9870: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
9880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
9890: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
98a0: 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  h this expressio
98b0: 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  n */.      while
98c0: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
98d0: 54 4b 5f 44 4f 54 20 29 20 70 43 6f 6c 45 78 70  TK_DOT ) pColExp
98e0: 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
98f0: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
9900: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
9910: 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59  _COLUMN && ALWAY
9920: 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  S(pColExpr->pTab
9930: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
9940: 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
9950: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
9960: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
9970: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
9980: 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
9990: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
99a0: 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a  pColExpr->pTab;.
99b0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
99c0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
99d0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
99e0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
99f0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
9a00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9a10: 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61     iCol>=0 ? pTa
9a20: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
9a30: 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a  ame : "rowid");.
9a40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9a50: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
9a60: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
9a70: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9a80: 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
9a90: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
9aa0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
9ab0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9ac0: 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45  (db, "%s", pColE
9ad0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
9ae0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9af0: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
9b00: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
9b10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
9b20: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
9b30: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e  me */.        zN
9b40: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
9b50: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70  intf(db, "%s", p
9b60: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
9b70: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
9b80: 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
9b90: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
9ba0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9bb0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
9bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9bd0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
9be0: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
9bf0: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
9c00: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
9c10: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
9c20: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
9c30: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
9c40: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
9c50: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
9c60: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
9c70: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
9c80: 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  e);.    for(j=cn
9c90: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
9ca0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9cb0: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
9cc0: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
9cd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
9ce0: 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20  r *zNewName;.   
9cf0: 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65       zName[nName
9d00: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  ] = 0;.        z
9d10: 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  NewName = sqlite
9d20: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
9d30: 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  :%d", zName, ++c
9d40: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
9d50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9d60: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a  Name);.        z
9d70: 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b  Name = zNewName;
9d80: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b  .        j = -1;
9d90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
9da0: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  me==0 ) break;. 
9db0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9dc0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
9dd0: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Name;.  }.  if( 
9de0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9df0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
9e00: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
9e10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9e20: 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  db, aCol[j].zNam
9e30: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
9e40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9e50: 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f  aCol);.    *paCo
9e60: 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f  l = 0;.    *pnCo
9e70: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  l = 0;.    retur
9e80: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9e90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9ea0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9eb0: 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f   Add type and co
9ec0: 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
9ed0: 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  ion to a column 
9ee0: 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  list based on.**
9ef0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
9f00: 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ent..** .** The 
9f10: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73  column list pres
9f20: 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d  umably came from
9f30: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d   selectColumnNam
9f40: 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  esFromExprList()
9f50: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ..** The column 
9f60: 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61  list has only na
9f70: 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f  mes, not types o
9f80: 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54  r collations.  T
9f90: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
9fa0: 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20  oes through and 
9fb0: 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61  adds the types a
9fc0: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a  nd collations..*
9fd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9fe0: 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
9ff0: 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20  all identifiers 
a000: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  in the SELECT.**
a010: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65   statement be re
a020: 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  solved..*/.stati
a030: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
a040: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
a050: 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20  lation(.  Parse 
a060: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
a070: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a080: 78 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  xts */.  int nCo
a090: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
a0a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
a0b0: 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  mns */.  Column 
a0c0: 2a 61 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f  *aCol,         /
a0d0: 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
a0e0: 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
a0f0: 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
a100: 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
a110: 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
a120: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
a130: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
a140: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a150: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
a160: 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
a170: 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
a180: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
a190: 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
a1a0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a1b0: 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *a;..  assert( p
a1c0: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
a1d0: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
a1e0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
a1f0: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
a200: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70   assert( nCol==p
a210: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
a220: 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
a230: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
a240: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
a250: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
a260: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
a270: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
a280: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
a290: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
a2a0: 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  a = pSelect->pEL
a2b0: 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  ist->a;.  for(i=
a2c0: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
a2d0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
a2e0: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d  +){.    p = a[i]
a2f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c  .pExpr;.    pCol
a300: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
a310: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f  3DbStrDup(db, co
a320: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
a330: 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20  , 0, 0, 0));.   
a340: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
a350: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
a360: 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66  inity(p);.    if
a370: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
a380: 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69  ==0 ) pCol->affi
a390: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
a3a0: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c  F_NONE;.    pCol
a3b0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
a3c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
a3d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
a3e0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e   ){.      pCol->
a3f0: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44  zColl = sqlite3D
a400: 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c  bStrDup(db, pCol
a410: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
a420: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
a430: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
a440: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
a450: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
a460: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
a470: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
a480: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
a490: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
a4a0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
a4b0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
a4c0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
a4d0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
a4e0: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
a4f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a500: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
a510: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
a520: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
a530: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
a540: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
a550: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
a560: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
a570: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
a580: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
a590: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
a5a0: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
a5b0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
a5c0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
a5d0: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
a5e0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
a5f0: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
a600: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
a610: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
a620: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
a630: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
a640: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
a650: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a660: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
a670: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
a680: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
a690: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
a6a0: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
a6b0: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
a6c0: 6c 65 64 2c 20 73 6f 20 77 65 20 6d 69 67 68 74  led, so we might
a6d0: 20 61 73 20 77 65 6c 6c 20 68 61 72 64 2d 63 6f   as well hard-co
a6e0: 64 65 20 70 54 61 62 2d 3e 64 62 4d 65 6d 20 74  de pTab->dbMem t
a6f0: 6f 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73  o NULL. */.  ass
a700: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
a710: 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29  de.bEnabled==0 )
a720: 3b 0a 20 20 70 54 61 62 2d 3e 64 62 4d 65 6d 20  ;.  pTab->dbMem 
a730: 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65  = 0;.  pTab->nRe
a740: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
a750: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73 65 6c 65  Name = 0;.  sele
a760: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
a770: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
a780: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26  elect->pEList, &
a790: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
a7a0: 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65  b->aCol);.  sele
a7b0: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
a7c0: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
a7d0: 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  se, pTab->nCol, 
a7e0: 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c  pTab->aCol, pSel
a7f0: 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
a800: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
a810: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a820: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
a830: 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61 62 29  eleteTable(pTab)
a840: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
a850: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
a860: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  b;.}../*.** Get 
a870: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
a880: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
a890: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
a8a0: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
a8b0: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
a8c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
a8d0: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
a8e0: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
a8f0: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
a900: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
a910: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
a920: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a930: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
a940: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
a950: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
a960: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
a970: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23  e(pParse->db);.#
a980: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a990: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28  IT_TRACE.    if(
a9a0: 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69   v ){.      sqli
a9b0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
a9c0: 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20 20 20   OP_Trace);.    
a9d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  }.#endif.  }.  r
a9e0: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn v;.}.../*.
a9f0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
aa00: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
aa10: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
aa20: 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
aa30: 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
aa40: 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
aa50: 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
aa60: 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
aa70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
aa80: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
aa90: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
aaa0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
aab0: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
aac0: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
aad0: 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
aae0: 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
aaf0: 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
ab00: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
ab10: 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
ab20: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
ab30: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
ab40: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
ab50: 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
ab60: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
ab70: 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
ab80: 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
ab90: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
aba0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
abb0: 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
abc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
abd0: 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
abe0: 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
abf0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
ac00: 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
ac10: 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
ac20: 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
ac30: 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
ac40: 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
ac50: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
ac60: 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
ac70: 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
ac80: 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73  lt values.** (us
ac90: 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c  ually but not al
aca0: 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74  ways -1) prior t
acb0: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
acc0: 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20  outine..** Only 
acd0: 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20  if pLimit!=0 or 
ace0: 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68  pOffset!=0 do th
acf0: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
ad00: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
ad10: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
ad20: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
ad30: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
ad40: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
ad50: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
ad60: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
ad70: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
ad80: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
ad90: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
ada0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
adb0: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
adc0: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
add0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
ade0: 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
adf0: 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
ae00: 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
ae10: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
ae20: 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20  int addr1, n;.  
ae30: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
ae40: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
ae50: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
ae60: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
ae70: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
ae80: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61  some.  ** contra
ae90: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
aea0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
aeb0: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
aec0: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
aed0: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
aee0: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
aef0: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
af00: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
af10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
af20: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
af30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
af40: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Offset==0 || p->
af50: 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  pLimit!=0 );.  i
af60: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
af70: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
af80: 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
af90: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
afa0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
afb0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
afc0: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
afd0: 65 74 75 72 6e 3b 20 20 2f 2a 20 56 44 42 45 20  eturn;  /* VDBE 
afe0: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
aff0: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
b000: 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  ed */.    if( sq
b010: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
b020: 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e  er(p->pLimit, &n
b030: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
b040: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b050: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69  OP_Integer, n, i
b060: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
b070: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
b080: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
b090: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
b0a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b0b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b0c0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
b0d0: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
b0e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
b0f0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
b100: 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  arse, p->pLimit,
b110: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
b120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b130: 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
b140: 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
b150: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
b160: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
b170: 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
b180: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b190: 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69  OP_IfZero, iLimi
b1a0: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
b1b0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66  }.    if( p->pOf
b1c0: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  fset ){.      p-
b1d0: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
b1e0: 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
b1f0: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
b200: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
b210: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
b220: 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
b230: 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
b240: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b250: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
b260: 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  pOffset, iOffset
b270: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b280: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
b290: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66  _MustBeInt, iOff
b2a0: 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
b2b0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
b2c0: 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
b2d0: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
b2e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b2f0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
b300: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
b310: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b320: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
b330: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
b340: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b350: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
b360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b370: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
b380: 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73  d, iLimit, iOffs
b390: 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  et, iOffset+1);.
b3a0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
b3b0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46  t((v, "LIMIT+OFF
b3c0: 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64  SET"));.      ad
b3d0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
b3e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
b3f0: 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  Pos, iLimit);.  
b400: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b410: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
b420: 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74  ger, -1, iOffset
b430: 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
b440: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b450: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a  , addr1);.    }.
b460: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
b470: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
b480: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
b490: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
b4a0: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
b4b0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
b4c0: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
b4d0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
b4e0: 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
b4f0: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
b500: 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
b510: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
b520: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
b530: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
b540: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
b550: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
b560: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
b570: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
b580: 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
b590: 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
b5a0: 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
b5b0: 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
b5c0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
b5d0: 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
b5e0: 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
b5f0: 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
b600: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
b610: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
b620: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
b630: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
b640: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
b650: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
b660: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
b670: 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
b680: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
b690: 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
b6a0: 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66   iCol>=0 );.  if
b6b0: 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43 6f  ( pRet==0 && iCo
b6c0: 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
b6d0: 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  pr ){.    pRet =
b6e0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
b6f0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
b700: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
b710: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
b720: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
b730: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b740: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
b750: 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  T */../* Forward
b760: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
b770: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
b780: 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
b790: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
b7a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b7b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
b7c0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
b7d0: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
b7e0: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
b7f0: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
b800: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
b810: 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
b820: 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
b830: 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a  results */.);...
b840: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b850: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
b860: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
b870: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
b880: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
b890: 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
b8a0: 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
b8b0: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
b8c0: 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
b8d0: 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
b8e0: 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
b8f0: 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
b900: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
b910: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
b920: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
b930: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
b940: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
b950: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
b960: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
b970: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
b980: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
b990: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
b9a0: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
b9b0: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
b9c0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
b9d0: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
b9e0: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
b9f0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
ba00: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
ba10: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
ba20: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
ba30: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
ba40: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
ba50: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
ba60: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
ba70: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
ba80: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
ba90: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
baa0: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
bab0: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
bac0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
bad0: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
bae0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
baf0: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
bb00: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
bb10: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
bb20: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb40: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
bb50: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
bb60: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
bb70: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
bb80: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
bb90: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
bba0: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
bbb0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
bbc0: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
bbd0: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
bbe0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
bbf0: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
bc00: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
bc10: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
bc20: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
bc30: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
bc40: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
bc50: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
bc60: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
bc70: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
bc80: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
bc90: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
bca0: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
bcb0: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
bcc0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
bcd0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
bce0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
bcf0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
bd00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
bd10: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
bd20: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
bd30: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
bd40: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
bd50: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
bd60: 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
bd70: 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
bd80: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
bd90: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
bda0: 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
bdb0: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
bdc0: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
bdd0: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
bde0: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
bdf0: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
be00: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
be10: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
be20: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
be30: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
be40: 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
be50: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
be60: 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
be70: 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
be80: 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
be90: 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20  Delete = 0;  /* 
bea0: 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20  Chain of simple 
beb0: 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74  selects to delet
bec0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
bed0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
bee0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
bef0: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b  ion */..  /* Mak
bf00: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
bf10: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
bf20: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
bf30: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
bf40: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
bf50: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
bf60: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
bf70: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
bf80: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
bf90: 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
bfa0: 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
bfb0: 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
bfc0: 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
bfd0: 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
bfe0: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
bff0: 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
c000: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
c010: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
c020: 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29  htmost!=pPrior )
c030: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
c040: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d  or->pRightmost==
c050: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b  p->pRightmost );
c060: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
c070: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
c080: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
c090: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c0a0: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
c0b0: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
c0c0: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
c0d0: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
c0e0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
c0f0: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
c100: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
c110: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
c120: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
c130: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
c140: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c150: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
c160: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
c170: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
c180: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
c190: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
c1a0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
c1b0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c1c0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
c1d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c1e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
c1f0: 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
c200: 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
c210: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
c220: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
c230: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
c240: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
c250: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
c260: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
c270: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
c280: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
c290: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
c2a0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
c2b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c2c0: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
c2d0: 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c  ral, dest.iParm,
c2e0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
c2f0: 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  r);.    dest.eDe
c300: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
c310: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
c320: 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
c330: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
c340: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
c350: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
c360: 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
c370: 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
c380: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
c390: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
c3a0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
c3b0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
c3c0: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
c3d0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
c3e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c3f0: 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
c400: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
c410: 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
c420: 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
c430: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
c440: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
c450: 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
c460: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
c470: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
c480: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c490: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  d;.  }..  /* Com
c4a0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
c4b0: 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
c4c0: 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
c4d0: 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
c4e0: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
c4f0: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
c500: 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
c510: 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
c520: 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
c530: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
c540: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
c550: 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
c560: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
c570: 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
c580: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
c590: 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
c5a0: 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
c5b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
c5c0: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
c5d0: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
c5e0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
c5f0: 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
c600: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
c610: 66 73 65 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  fset;.      rc =
c620: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
c630: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
c640: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dest);.      p->
c650: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
c660: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
c670: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c680: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
c690: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c6a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
c6b0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
c6c0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
c6d0: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
c6e0: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
c6f0: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
c700: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
c710: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
c720: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c730: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c740: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
c750: 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  mit);.        Vd
c760: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
c770: 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
c780: 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
c790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
c7a0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
c7b0: 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
c7c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
c7d0: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
c7e0: 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74   );.      pDelet
c7f0: 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
c800: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
c810: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
c820: 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
c830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
c840: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
c850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
c860: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c870: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
c880: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
c890: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
c8a0: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
c8b0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
c8c0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
c8d0: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
c8e0: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f  lt */.      u8 o
c8f0: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  p = 0;       /* 
c900: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
c910: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
c920: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
c930: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
c940: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
c950: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
c960: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
c970: 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
c980: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
c990: 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
c9a0: 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
c9b0: 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
c9c0: 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
c9d0: 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
c9e0: 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
c9f0: 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ;..      testcas
ca00: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  e( p->op==TK_EXC
ca10: 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  EPT );.      tes
ca20: 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
ca30: 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
ca40: 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e  priorOp = SRT_Un
ca50: 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ion;.      if( d
ca60: 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72  est.eDest==prior
ca70: 4f 70 20 26 26 20 41 4c 57 41 59 53 28 21 70 2d  Op && ALWAYS(!p-
ca80: 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d 3e 70 4f  >pLimit &&!p->pO
ca90: 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ffset) ){.      
caa0: 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
cab0: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
cac0: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
cad0: 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
cae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68  .        ** righ
caf0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
cb00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
cb10: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 20 29  >pRightmost!=p )
cb20: 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68  ;  /* Can only h
cb30: 61 70 70 65 6e 20 66 6f 72 20 6c 65 66 74 77 61  appen for leftwa
cb40: 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  rd elements.    
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61 79 20 6f   ** of a 3-way o
cb80: 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75 6e 64 20  r more compound 
cb90: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
cba0: 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20  t( p->pLimit==0 
cbb0: 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61  );      /* Not a
cbc0: 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
cbd0: 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
cbe0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cbf0: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
cc00: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
cc10: 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
cc20: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
cc30: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
cc40: 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20  st.iParm;.      
cc50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
cc60: 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
cc70: 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
cc80: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
cc90: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
cca0: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
ccb0: 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
ccc0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ccd0: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
cce0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
ccf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
cd00: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
cd10: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
cd20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cd30: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
cd40: 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
cd50: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
cd60: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
cd70: 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
cd80: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
cd90: 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
cda0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67  .        p->pRig
cdb0: 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73  htmost->selFlags
cdc0: 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
cdd0: 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  eral;.        as
cde0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
cdf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
ce00: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
ce10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
ce20: 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
ce30: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
ce40: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
ce50: 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71  erBy );.      sq
ce60: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
ce70: 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20  nit(&uniondest, 
ce80: 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
ce90: 62 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  b);.      rc = s
cea0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
ceb0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
cec0: 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
ced0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
cee0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
cef0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
cf00: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
cf10: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
cf20: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
cf30: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
cf40: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
cf50: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
cf60: 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
cf70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cf80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
cf90: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
cfa0: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
cfb0: 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
cfc0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
cfd0: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
cfe0: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
cff0: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
d000: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
d010: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
d020: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
d030: 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
d040: 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
d050: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d060: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
d070: 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
d080: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d090: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
d0a0: 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20  .      /* Query 
d0b0: 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
d0c0: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
d0d0: 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
d0e0: 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a  rderBy..      **
d0f0: 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65   Be sure to dele
d100: 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  te p->pOrderBy, 
d110: 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76  therefore, to av
d120: 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
d130: 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
d140: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
d150: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
d160: 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  y);.      pDelet
d170: 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
d180: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
d190: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
d1a0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
d1b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d1c0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
d1d0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
d1e0: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
d1f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
d200: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
d210: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
d220: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  0;.      p->iOff
d230: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  set = 0;..      
d240: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
d250: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
d260: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
d270: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
d280: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
d290: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
d2a0: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
d2b0: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f      assert( unio
d2c0: 6e 54 61 62 3d 3d 64 65 73 74 2e 69 50 61 72 6d  nTab==dest.iParm
d2d0: 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
d2e0: 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
d2f0: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
d300: 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
d310: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
d320: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
d330: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d340: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
d350: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
d360: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
d370: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
d380: 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
d390: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
d3a0: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
d3b0: 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
d3c0: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
d3d0: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
d3e0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
d3f0: 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
d400: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
d410: 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
d420: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d430: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
d440: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
d450: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
d460: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
d470: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
d480: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
d490: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
d4a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d4b0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
d4c0: 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
d4d0: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
d4e0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d4f0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
d500: 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
d510: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
d520: 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
d530: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
d540: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
d560: 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74  -1, &dest, iCont
d570: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
d580: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
d590: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
d5a0: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
d5b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d5c0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
d5d0: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
d5e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d5f0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d600: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
d610: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d620: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
d630: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
d640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
d650: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
d660: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
d670: 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  p->op==TK_INTERS
d680: 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ECT ); {.      i
d690: 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
d6a0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
d6b0: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
d6c0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
d6d0: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20  it, *pOffset;.  
d6e0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
d6f0: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69      SelectDest i
d700: 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20  ntersectdest;.  
d710: 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20      int r1;..   
d720: 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
d730: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
d740: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
d750: 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
d760: 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
d770: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
d780: 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
d790: 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
d7a0: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
d7b0: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
d7c0: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
d7d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d7e0: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
d7f0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
d800: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
d810: 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
d820: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
d830: 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20   );..      addr 
d840: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d850: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
d860: 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30  hemeral, tab1, 0
d870: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d880: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
d890: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
d8a0: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
d8b0: 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
d8c0: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
d8d0: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  t->selFlags |= S
d8e0: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
d8f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d900: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
d910: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
d920: 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
d930: 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
d940: 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
d950: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
d960: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
d970: 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
d980: 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
d990: 74 61 62 31 29 3b 0a 20 20 20 20 20 20 72 63 20  tab1);.      rc 
d9a0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
d9b0: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
d9c0: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
d9d0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
d9e0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
d9f0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
da00: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
da10: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
da20: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
da30: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
da40: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
da50: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
da60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
da70: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
da80: 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
da90: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
daa0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
dab0: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
dac0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
dad0: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
dae0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
daf0: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
db00: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
db10: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
db20: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
db30: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
db40: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
db50: 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
db60: 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a  t.iParm = tab2;.
db70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
db80: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
db90: 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
dba0: 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
dbb0: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
dbc0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
dbd0: 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
dbe0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
dbf0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
dc00: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
dc10: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
dc20: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
dc30: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
dc40: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
dc50: 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20  pOffset;..      
dc60: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
dc70: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
dc80: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
dc90: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
dca0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
dcb0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
dcc0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
dcd0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
dce0: 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  st.eDest==SRT_Ou
dcf0: 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
dd00: 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
dd10: 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   p;.        whil
dd20: 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
dd30: 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
dd40: 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
dd50: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
dd60: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
dd70: 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
dd80: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
dd90: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
dda0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ddb0: 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
ddc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
ddd0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
dde0: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
ddf0: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
de00: 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
de10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de20: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
de30: 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
de40: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
de50: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
de60: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74  arse);.      iSt
de70: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
de80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
de90: 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b  wKey, tab1, r1);
dea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
deb0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
dec0: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
ded0: 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b  , iCont, r1, 0);
dee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
def0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
df00: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
df10: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
df20: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
df30: 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70  List, tab1, p->p
df40: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74      0, -1, &dest
df70: 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
df80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
df90: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
dfa0: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
dfb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dfc0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  p2(v, OP_Next, t
dfd0: 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ab1, iStart);.  
dfe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
dff0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
e000: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
e010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e020: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
e030: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
e040: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e050: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
e060: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
e070: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
e080: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
e090: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
e0a0: 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
e0b0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
e0c0: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
e0d0: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
e0e0: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
e0f0: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
e100: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
e110: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
e120: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
e130: 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
e140: 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
e150: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
e160: 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
e170: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
e180: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
e190: 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
e1a0: 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
e1b0: 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
e1c0: 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
e1d0: 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
e1e0: 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
e1f0: 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
e200: 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
e210: 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
e220: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
e230: 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
e240: 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
e250: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
e260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e270: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
e280: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
e290: 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
e2a0: 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
e2b0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
e2c0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
e2d0: 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e2f0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
e300: 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
e310: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
e320: 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
e330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
e340: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
e350: 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
e360: 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
e370: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
e380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e390: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
e3a0: 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
e3b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
e3c0: 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b  pRightmost==p );
e3d0: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  .    nCol = p->p
e3e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
e3f0: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
e400: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
e410: 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  (db,.           
e420: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
e430: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43  of(*pKeyInfo)+nC
e440: 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ol*(sizeof(CollS
e450: 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20  eq*) + 1));.    
e460: 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
e470: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e480: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
e490: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
e4a0: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
e4b0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20    pKeyInfo->enc 
e4c0: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70  = ENC(db);.    p
e4d0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
e4e0: 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a 20 20  = (u16)nCol;..  
e4f0: 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
e500: 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
e510: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
e520: 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
e530: 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
e540: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
e550: 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
e560: 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
e570: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
e580: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
e590: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
e5a0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f    }..    for(pLo
e5b0: 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
e5c0: 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
e5d0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
e5e0: 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
e5f0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
e600: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
e610: 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
e620: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
e630: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
e640: 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
e650: 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
e660: 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
e670: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
e680: 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
e690: 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
e6a0: 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
e6b0: 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
e6c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e6d0: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
e6e0: 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
e6f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
e710: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
e720: 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
e730: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e740: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
e750: 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70  , addr, (char*)p
e760: 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
e770: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
e780: 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
e790: 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
e7a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
e7b0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
e7c0: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
e7d0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
e7e0: 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d  .  pDest->iMem =
e7f0: 20 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44   dest.iMem;.  pD
e800: 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74  est->nMem = dest
e810: 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  .nMem;.  sqlite3
e820: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
e830: 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74   pDelete);.  ret
e840: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
e850: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e860: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
e870: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
e880: 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
e890: 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
e8a0: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
e8b0: 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
e8c0: 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
e8d0: 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
e8e0: 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
e8f0: 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65  ined in pIn->iMe
e900: 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  m.  There are.**
e910: 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d   pIn->nMem colum
e920: 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  ns to be output.
e930: 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65    pDest is where
e940: 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75   the output shou
e950: 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a  ld.** be sent..*
e960: 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69  *.** regReturn i
e970: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
e980: 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  the register hol
e990: 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
e9a0: 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64  ine.** return ad
e9b0: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dress..**.** If 
e9c0: 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69  regPrev>0 then i
e9d0: 74 20 69 73 20 61 20 74 68 65 20 66 69 72 73 74  t is a the first
e9e0: 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
e9f0: 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
ea00: 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
ea10: 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
ea20: 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
ea30: 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
ea40: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
ea50: 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
ea60: 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
ea70: 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
ea80: 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
ea90: 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
eaa0: 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
eab0: 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
eac0: 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
ead0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
eae0: 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
eaf0: 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
eb00: 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
eb10: 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
eb20: 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
eb30: 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
eb40: 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
eb50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
eb60: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
eb70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
eb80: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
eb90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
eba0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
ebb0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
ebc0: 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
ebd0: 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
ebe0: 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
ebf0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
ec00: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
ec10: 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
ec20: 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
ec30: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
ec40: 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
ec50: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
ec60: 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
ec70: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
ec80: 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
ec90: 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
eca0: 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
ecb0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
ecc0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
ecd0: 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
ece0: 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
ecf0: 6e 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20  nt p4type,      
ed00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34         /* The p4
ed10: 20 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e   type for pKeyIn
ed20: 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  fo */.  int iBre
ed30: 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
ed40: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
ed50: 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
ed60: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
ed70: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ed80: 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
ed90: 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
eda0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
edb0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
edc0: 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
edd0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
ede0: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
edf0: 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
ee00: 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
ee10: 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
ee20: 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
ee30: 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
ee40: 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20   int j1, j2;.   
ee50: 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
ee60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
ee70: 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  Not, regPrev);. 
ee80: 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
ee90: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
eea0: 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d  Compare, pIn->iM
eeb0: 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  em, regPrev+1, p
eec0: 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20  In->nMem,.      
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
eef0: 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29  KeyInfo, p4type)
ef00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ef10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
ef20: 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
ef30: 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20  nue, j2+2);.    
ef40: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ef50: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
ef60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
ef70: 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  opy(pParse, pIn-
ef80: 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31  >iMem, regPrev+1
ef90: 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  , pIn->nMem);.  
efa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
efb0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
efc0: 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
efd0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
efe0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
eff0: 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
f000: 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
f010: 65 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  e the first OFFS
f020: 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
f030: 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
f040: 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
f050: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
f060: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73  iContinue);..  s
f070: 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44  witch( pDest->eD
f080: 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74  est ){.    /* St
f090: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
f0a0: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
f0b0: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
f0c0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
f0d0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
f0e0: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
f0f0: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
f100: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
f110: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
f120: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
f130: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
f140: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f150: 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  e( pDest->eDest=
f160: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
f170: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
f180: 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
f190: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
f1a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f1b0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
f1c0: 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  cord, pIn->iMem,
f1d0: 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b   pIn->nMem, r1);
f1e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f1f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
f200: 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
f210: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
f220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f230: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
f240: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
f250: 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
f260: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
f270: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
f280: 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
f290: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f2a0: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
f2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
f2c0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
f2d0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
f2e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
f2f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f300: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
f310: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
f320: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
f330: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
f340: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
f350: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
f360: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
f370: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
f380: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
f390: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
f3a0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
f3b0: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
f3c0: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
f3d0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
f3e0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
f3f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
f400: 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20  ->nMem==1 );.   
f410: 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d     p->affinity =
f420: 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74   .         sqlit
f430: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
f440: 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  y(p->pEList->a[0
f450: 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
f460: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
f470: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
f480: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
f490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f4a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
f4b0: 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
f4c0: 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d  iMem, 1, r1, &p-
f4d0: 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
f4e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f4f0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
f500: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
f510: 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20  >iMem, 1);.     
f520: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f530: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
f540: 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  rt, pDest->iParm
f550: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
f560: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
f570: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
f580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f590: 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65   }..#if 0  /* Ne
f5a0: 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e  ver occurs on an
f5b0: 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20   ORDER BY query 
f5c0: 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  */.    /* If any
f5d0: 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
f5e0: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
f5f0: 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
f600: 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
f610: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
f620: 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
f630: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f640: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
f650: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b  , pDest->iParm);
f660: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
f670: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
f680: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
f690: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
f6a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f6b0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
f6c0: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
f6d0: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
f6e0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
f6f0: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
f700: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
f710: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
f720: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
f730: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
f740: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
f750: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
f760: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
f770: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
f780: 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d  sert( pIn->nMem=
f790: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
f7a0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
f7b0: 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
f7c0: 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  m, pDest->iParm,
f7d0: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
f7e0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
f7f0: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
f800: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
f810: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
f820: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
f830: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f840: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
f850: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  .    /* The resu
f860: 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
f870: 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
f880: 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a  registers.    **
f890: 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65   starting at pDe
f8a0: 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 6e 20  st->iMem.  Then 
f8b0: 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
f8c0: 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
f8d0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
f8e0: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
f8f0: 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30  ( pDest->iMem==0
f900: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
f910: 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65  t->iMem = sqlite
f920: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
f930: 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  arse, pIn->nMem)
f940: 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
f950: 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d 65  >nMem = pIn->nMe
f960: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
f970: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f980: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
f990: 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69  ->iMem, pDest->i
f9a0: 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  Mem, pDest->nMem
f9b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f9c0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f9d0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
f9e0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
f9f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
fa00: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
fa10: 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
fa20: 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74   result destinat
fa30: 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ion must be.    
fa40: 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20  ** SRT_Output.  
fa50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
fa60: 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  never called wit
fa70: 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20  h any other.    
fa80: 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  ** destination o
fa90: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
faa0: 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65  es handled above
fab0: 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a   or SRT_Output..
fac0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
fad0: 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65  r SRT_Output, re
fae0: 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
faf0: 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
fb00: 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20  f registers.  . 
fb10: 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f     ** Then the O
fb20: 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
fb30: 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61  de is used to ca
fb40: 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  use sqlite3_step
fb50: 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74  () to.    ** ret
fb60: 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77  urn the next row
fb70: 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20   of result..    
fb80: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
fb90: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
fba0: 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
fbb0: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
fbc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fbd0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
fbe0: 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  Row, pIn->iMem, 
fbf0: 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
fc00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
fc10: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
fc20: 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d  (pParse, pIn->iM
fc30: 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  em, pIn->nMem);.
fc40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fc50: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
fc60: 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
fc70: 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
fc80: 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
fc90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
fca0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
fcb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
fcc0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
fcd0: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
fce0: 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   -1);.  }..  /* 
fcf0: 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62  Generate the sub
fd00: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20  routine return. 
fd10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
fd20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
fd30: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73   iContinue);.  s
fd40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fd50: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
fd60: 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65  egReturn);..  re
fd70: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
fd80: 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20  .** Alternative 
fd90: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
fda0: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66  code generator f
fdb0: 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68  or cases when th
fdc0: 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44  ere.** is an ORD
fdd0: 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  ER BY clause..**
fde0: 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20  .** We assume a 
fdf0: 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c  query of the fol
fe00: 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
fe10: 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41  **      <selectA
fe20: 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c  >  <operator>  <
fe30: 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20  selectB>  ORDER 
fe40: 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e  BY <orderbylist>
fe50: 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  .**.** <operator
fe60: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f  > is one of UNIO
fe70: 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58  N ALL, UNION, EX
fe80: 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
fe90: 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a  CT.  The idea.**
fea0: 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68   is to code both
feb0: 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c   <selectA> and <
fec0: 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68  selectB> with th
fed0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
fee0: 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69  e as.** co-routi
fef0: 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74  nes.  Then run t
ff00: 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69  he co-routines i
ff10: 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d  n parallel and m
ff20: 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73  erge the results
ff30: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  .** into the out
ff40: 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  put.  In additio
ff50: 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72  n to the two cor
ff60: 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20  outines (called 
ff70: 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73  selectA and.** s
ff80: 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72  electB) there ar
ff90: 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a  e 7 subroutines:
ffa0: 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  .**.**    outA: 
ffb0: 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
ffc0: 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
ffd0: 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  A coroutine into
ffe0: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
fff0: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
10000 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
10010 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  ..**.**    outB:
10020 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
10030 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
10040 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tB coroutine int
10050 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
10060 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
10070 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
10080 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61  y.  (Only genera
10090 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e  ted for UNION an
100a0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
100b0 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43   UNION ALL.  EXC
100c0 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45  EPT and INSERTSE
100d0 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20  CT never output 
100e0 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20  a row that.**   
100f0 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72            appear
10100 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a  s only in B.).**
10110 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20  .**    AltB:    
10120 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
10130 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
10140 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
10150 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A<B..**.**   
10160 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64   AeqB:    Called
10170 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
10180 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
10190 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d  routines and A==
101a0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42  B..**.**    AgtB
101b0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
101c0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
101d0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
101e0 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a  nes and A>B..**.
101f0 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43  **    EofA:    C
10200 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
10210 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
10220 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a  m selectA..**.**
10230 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c      EofB:    Cal
10240 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
10250 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
10260 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54  selectB..**.** T
10270 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
10280 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20  n of the latter 
10290 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73  five subroutines
102a0 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68   depend on which
102b0 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20   .** <operator> 
102c0 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a  is used:.**.**.*
102d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
102e0 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20  ION ALL         
102f0 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20  UNION           
10300 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20   EXCEPT         
10310 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20   INTERSECT.**   
10320 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
10330 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
10340 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
10350 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
10360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
10370 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AltB:   outA, ne
10380 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
10390 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
103a0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
103b0 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71  extA.**.**   Aeq
103c0 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
103d0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
103e0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41             nextA
103f0 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e           outA, n
10400 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74  extA.**.**   Agt
10410 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  B:   outB, nextB
10420 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
10430 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42  B          nextB
10440 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
10450 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20  B.**.**   EofA: 
10460 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
10470 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
10480 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20          halt    
10490 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
104a0 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75  .**   EofB:   ou
104b0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
104c0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
104d0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
104e0 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
104f0 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71  In the AltB, Aeq
10500 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72  B, and AgtB subr
10510 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20  outines, an EOF 
10520 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on A following n
10530 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61  extA.** causes a
10540 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
10550 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20   to EofA and an 
10560 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69  EOF on B followi
10570 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a  ng nextB causes.
10580 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  ** an immediate 
10590 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57  jump to EofB.  W
105a0 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45  ithin EofA and E
105b0 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20  ofB, and EOF on 
105c0 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c  entry or.** foll
105d0 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73  owing nextX caus
105e0 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65  es a jump to the
105f0 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65   end of the sele
10600 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  ct processing..*
10610 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72  *.** Duplicate r
10620 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e  emoval in the UN
10630 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
10640 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73   INTERSECT cases
10650 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77   is handled.** w
10660 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ithin the output
10670 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
10680 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74  e regPrev regist
10690 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65  er set holds the
106a0 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f   previously.** o
106b0 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20  utput value.  A 
106c0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
106d0 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  de against this 
106e0 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75  value and the ou
106f0 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70  tput.** is skipp
10700 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72  ed if the next r
10710 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20  esults would be 
10720 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
10730 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20  previous..**.** 
10740 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
10750 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d  on plan is to im
10760 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20  plement the two 
10770 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73  coroutines and s
10780 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69  even.** subrouti
10790 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20  nes first, then 
107a0 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20  put the control 
107b0 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74  logic at the bot
107c0 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  tom.  Like this:
107d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
107e0 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20  goto Init.**    
107f0 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coA: coroutine 
10800 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28  for left query (
10810 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63  A).**     coB: c
10820 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
10830 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20  ht query (B).** 
10840 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20     outA: output 
10850 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20  one row of A.** 
10860 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20     outB: output 
10870 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e  one row of B (UN
10880 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c  ION and UNION AL
10890 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f  L only).**    Eo
108a0 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f  fA: ....**    Eo
108b0 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c  fB: ....**    Al
108c0 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65  tB: ....**    Ae
108d0 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67  qB: ....**    Ag
108e0 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e  tB: ....**    In
108f0 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  it: initialize c
10900 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65  oroutine registe
10910 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  rs.**          y
10920 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20  ield coA.**     
10930 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67       if eof(A) g
10940 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20  oto EofA.**     
10950 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a       yield coB.*
10960 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
10970 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a  f(B) goto EofB.*
10980 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61  *    Cmpr: Compa
10990 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20  re A, B.**      
109a0 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41      Jump AltB, A
109b0 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20  eqB, AgtB.**    
109c0 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   End: ....**.** 
109d0 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65  We call AltB, Ae
109e0 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20  qB, AgtB, EofA, 
109f0 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75  and EofB "subrou
10a00 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20  tines" but they 
10a10 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61  are not.** actua
10a20 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67  lly called using
10a30 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20   Gosub and they 
10a40 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20  do not Return.  
10a50 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f  EofA and EofB lo
10a60 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20  op.** until all 
10a70 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
10a80 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74  d then jump to t
10a90 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20  he "end" labe.  
10aa0 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61  AltB, AeqB,.** a
10ab0 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20  nd AgtB jump to 
10ac0 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20  either L2 or to 
10ad0 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45  one of EofA or E
10ae0 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ofB..*/.#ifndef 
10af0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
10b00 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74  OUND_SELECT.stat
10b10 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
10b20 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
10b30 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
10b40 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
10b50 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
10b60 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
10b70 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
10b80 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
10b90 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
10ba0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
10bb0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
10bc0 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
10bd0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
10be0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
10bf0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
10c00 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ters */.  Select
10c10 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
10c20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
10c30 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
10c40 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
10c50 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
10c60 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
10c70 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
10c80 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
10c90 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a  st destA;     /*
10ca0 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
10cb0 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a   coroutine A */.
10cc0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
10cd0 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tB;     /* Desti
10ce0 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
10cf0 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20  tine B */.  int 
10d00 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20  regAddrA;       
10d10 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
10d20 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
10d30 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
10d40 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20    int regEofA;  
10d50 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
10d60 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e  to indicate when
10d70 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d   select-A is com
10d80 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72  plete */.  int r
10d90 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
10da0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
10db0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
10dc0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
10dd0 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20   int regEofB;   
10de0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74         /* Flag t
10df0 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20  o indicate when 
10e00 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70  select-B is comp
10e10 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  lete */.  int ad
10e20 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
10e30 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
10e40 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
10e50 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
10e60 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
10e70 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
10e80 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
10e90 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
10ea0 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
10eb0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
10ec0 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
10ed0 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
10ee0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
10ef0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
10f00 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
10f10 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
10f20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10f30 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
10f40 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10f50 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
10f60 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
10f70 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
10f80 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
10f90 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
10fa0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
10fb0 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
10fc0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10fd0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
10fe0 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
10ff0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
11000 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
11010 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
11020 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
11030 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
11040 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
11050 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
11060 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
11070 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
11080 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
11090 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
110a0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
110b0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
110c0 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
110d0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
110e0 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
110f0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
11100 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
11110 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
11120 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
11130 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
11140 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
11150 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
11160 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
11170 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
11180 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
11190 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
111a0 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
111b0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
111c0 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
111d0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
111e0 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
111f0 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
11200 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
11210 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
11220 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
11230 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
11240 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
11250 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
11260 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
11270 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
11280 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
11290 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
112a0 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
112b0 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
112c0 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
112d0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
112e0 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
112f0 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
11300 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
11310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
11320 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
11330 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
11340 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
11350 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
11360 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
11370 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
11380 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
11390 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
113a0 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
113b0 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
113c0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
113d0 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
113e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
113f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
11400 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11410 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11420 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
11430 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11440 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
11450 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
11460 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
11470 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
11480 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
11490 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
114a0 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
114b0 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
114c0 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
114d0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73  columns */..  as
114e0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
114f0 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y!=0 );.  assert
11500 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20  ( pKeyDup==0 ); 
11510 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64  /* "Managed" cod
11520 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54  e needs this.  T
11530 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a  icket #3382. */.
11540 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
11550 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  b;.  v = pParse-
11560 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
11570 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
11580 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77  /* Already throw
11590 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56  n the error if V
115a0 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64  DBE alloc failed
115b0 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d   */.  labelEnd =
115c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
115d0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65  Label(v);.  labe
115e0 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56  lCmpr = sqlite3V
115f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11600 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70  ...  /* Patch up
11610 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11620 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ause.  */.  op =
11630 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69   p->op;  .  pPri
11640 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
11650 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
11660 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
11670 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
11680 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
11690 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b  ert( pOrderBy );
116a0 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
116b0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a  rderBy->nExpr;..
116c0 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f    /* For operato
116d0 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  rs other than UN
116e0 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20  ION ALL we have 
116f0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
11700 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52  t.  ** the ORDER
11710 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72   BY clause cover
11720 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  s every term of 
11730 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
11740 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20   Add.  ** terms 
11750 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
11760 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73  clause as necess
11770 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
11780 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
11790 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d    for(i=1; db->m
117a0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
117b0 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  & i<=p->pEList->
117c0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
117d0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
117e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
117f0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
11800 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
11810 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  ; j<nOrderBy; j+
11820 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
11830 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
11840 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20 20  em->iCol>0 );.  
11850 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
11860 3e 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  >iCol==i ) break
11870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11880 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
11890 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
118a0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
118b0 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
118c0 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
118d0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
118e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
118f0 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
11900 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
11910 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
11920 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
11930 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
11940 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
11950 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
11960 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
11970 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  ew);.        pOr
11980 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42  derBy->a[nOrderB
11990 79 2b 2b 5d 2e 69 43 6f 6c 20 3d 20 28 75 31 36  y++].iCol = (u16
119a0 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
119b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
119c0 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ute the comparis
119d0 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61  on permutation a
119e0 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20  nd keyinfo that 
119f0 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a  is used with.  *
11a00 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * the permutatio
11a10 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  n used to determ
11a20 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
11a30 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
11a40 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
11a50 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
11a60 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
11a70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
11a80 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
11a90 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
11aa0 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
11ab0 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
11ac0 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
11ad0 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
11ae0 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
11af0 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
11b00 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
11b10 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
11b20 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
11b30 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
11b40 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29  f(int)*nOrderBy)
11b50 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
11b60 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
11b70 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
11b80 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  tem;.    for(i=0
11b90 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
11ba0 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  ->a; i<nOrderBy;
11bb0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
11bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
11bd0 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26 26 20  tem->iCol>0  && 
11be0 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e  pItem->iCol<=p->
11bf0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
11c00 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
11c10 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43 6f 6c  i] = pItem->iCol
11c20 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
11c30 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20 20  pKeyMerge =.    
11c40 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f    sqlite3DbMallo
11c50 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
11c60 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64  *pKeyMerge)+nOrd
11c70 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  erBy*(sizeof(Col
11c80 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20  lSeq*)+1));.    
11c90 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b  if( pKeyMerge ){
11ca0 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
11cb0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
11cc0 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e  u8*)&pKeyMerge->
11cd0 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b  aColl[nOrderBy];
11ce0 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
11cf0 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
11d00 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  nOrderBy;.      
11d10 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d  pKeyMerge->enc =
11d20 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20   ENC(db);.      
11d30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
11d40 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
11d50 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
11d60 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  l;.        Expr 
11d70 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42  *pTerm = pOrderB
11d80 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
11d90 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
11da0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
11db0 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
11dc0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65       pColl = pTe
11dd0 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  rm->pColl;.     
11de0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11df0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
11e00 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
11e10 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75  Parse, p, aPermu
11e20 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  te[i]);.        
11e30 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
11e40 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
11e50 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d  .          pTerm
11e60 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
11e70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11e80 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43     pKeyMerge->aC
11e90 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
11ea0 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67          pKeyMerg
11eb0 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  e->aSortOrder[i]
11ec0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
11ed0 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
11ee0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
11ef0 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
11f00 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
11f10 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
11f20 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
11f30 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
11f40 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
11f50 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
11f60 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
11f70 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11f80 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
11f90 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
11fa0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
11fb0 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
11fc0 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
11fd0 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
11fe0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
11ff0 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
12000 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
12010 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
12020 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
12030 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
12040 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
12050 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
12060 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
12070 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
12080 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
12090 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
120a0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
120b0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
120c0 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
120d0 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
120e0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
120f0 65 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33  egPrev = sqlite3
12100 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
12110 72 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20  rse, nExpr+1);. 
12120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12130 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
12140 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b  er, 0, regPrev);
12150 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73  .    pKeyDup = s
12160 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
12170 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  ro(db,.         
12180 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
12190 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78 70  *pKeyDup) + nExp
121a0 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  r*(sizeof(CollSe
121b0 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69 66  q*)+1) );.    if
121c0 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20  ( pKeyDup ){.   
121d0 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
121e0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
121f0 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45  KeyDup->aColl[nE
12200 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79  xpr];.      pKey
12210 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  Dup->nField = (u
12220 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  16)nExpr;.      
12230 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45  pKeyDup->enc = E
12240 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f  NC(db);.      fo
12250 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
12260 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
12270 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  eyDup->aColl[i] 
12280 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
12290 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
122a0 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
122b0 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Dup->aSortOrder[
122c0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
122d0 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a      }.  }. .  /*
122e0 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65   Separate the le
122f0 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74  ft and the right
12300 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20   query from one 
12310 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70  another.  */.  p
12320 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
12330 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
12340 73 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  st = 0;.  sqlite
12350 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
12360 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
12370 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
12380 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72  DER");.  if( pPr
12390 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
123a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
123b0 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
123c0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
123d0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
123e0 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d  y, "ORDER");.  }
123f0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
12400 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
12410 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  rs */.  computeL
12420 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
12430 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e  arse, p, labelEn
12440 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
12450 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c  mit && op==TK_AL
12460 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  L ){.    regLimi
12470 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
12480 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69  Mem;.    regLimi
12490 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
124a0 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
124b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
124c0 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65  _Copy, p->iOffse
124d0 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  t ? p->iOffset+1
124e0 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20   : p->iLimit,.  
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20  regLimitA);.    
12520 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12530 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
12540 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69  gLimitA, regLimi
12550 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tB);.  }else{.  
12560 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65    regLimitA = re
12570 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d  gLimitB = 0;.  }
12580 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
12590 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
125a0 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  it);.  p->pLimit
125b0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
125c0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
125d0 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e  >pOffset);.  p->
125e0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  pOffset = 0;..  
125f0 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
12600 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
12610 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  EofA = ++pParse-
12620 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
12630 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
12640 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20  em;.  regEofB = 
12650 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12660 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
12670 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
12680 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
12690 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
126a0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
126b0 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
126c0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
126d0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
126e0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
126f0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
12700 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
12710 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20  * Jump past the 
12720 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69  various subrouti
12730 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e  nes and coroutin
12740 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20  es to the main. 
12750 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20   ** merge loop. 
12760 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74   */.  j1 = sqlit
12770 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
12780 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72  OP_Goto);.  addr
12790 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65  SelectA = sqlite
127a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
127b0 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65  (v);...  /* Gene
127c0 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
127d0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
127e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
127f0 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65  t to the.  ** le
12800 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ft of the compou
12810 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68  nd operator - th
12820 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20  e "A" select..  
12830 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
12840 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
12850 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
12860 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
12870 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
12880 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73 71   regLimitA;.  sq
12890 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
128a0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
128b0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
128c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
128d0 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f  nteger, 1, regEo
128e0 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
128f0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
12900 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
12910 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
12920 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f  nt((v, "End coro
12930 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53  utine for left S
12940 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20  ELECT"));..  /* 
12950 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
12960 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
12970 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
12980 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
12990 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
129a0 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
129b0 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
129c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
129d0 74 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65  tAddr(v);.  Vdbe
129e0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
129f0 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65  "Begin coroutine
12a00 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43   for right SELEC
12a10 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d  T"));.  savedLim
12a20 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
12a30 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20    savedOffset = 
12a40 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
12a50 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
12a60 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  itB;.  p->iOffse
12a70 74 20 3d 20 30 3b 20 20 0a 20 20 73 71 6c 69 74  t = 0;  .  sqlit
12a80 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
12a90 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
12aa0 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
12ab0 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
12ac0 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
12ad0 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
12ae0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
12af0 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42  eger, 1, regEofB
12b00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12b10 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
12b20 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
12b30 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
12b40 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74  ((v, "End corout
12b50 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45  ine for right SE
12b60 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47  LECT"));..  /* G
12b70 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
12b80 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
12b90 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
12ba0 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20  w of the A.  ** 
12bb0 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
12bc0 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
12bd0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
12be0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
12bf0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
12c00 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
12c10 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64   for A"));.  add
12c20 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65  rOutA = generate
12c30 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
12c40 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
12c50 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
12c60 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stA, pDest, regO
12c70 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utA,.           
12c80 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
12c90 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e  KeyDup, P4_KEYIN
12ca0 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65  FO_HANDOFF, labe
12cb0 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47  lEnd);.  .  /* G
12cc0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
12cd0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
12ce0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
12cf0 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20  w of the B.  ** 
12d00 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
12d10 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
12d20 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
12d30 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lect..  */.  if(
12d40 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
12d50 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
12d60 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
12d70 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
12d80 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b  outine for B"));
12d90 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20  .    addrOutB = 
12da0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
12db0 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
12dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12dd0 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65    p, &destB, pDe
12de0 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20  st, regOutB,.   
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
12e00 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
12e10 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49  P4_KEYINFO_STATI
12e20 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  C, labelEnd);.  
12e30 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
12e40 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
12e50 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
12e60 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
12e70 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
12e80 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
12e90 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
12ea0 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
12eb0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
12ec0 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
12ed0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28  outine"));.  if(
12ee0 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
12ef0 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
12f00 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
12f10 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
12f20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
12f30 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  o, 0, labelEnd);
12f40 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
12f50 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
12f60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12f70 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20  OP_If, regEofB, 
12f80 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73  labelEnd);.    s
12f90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12fa0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
12fb0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
12fc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12fd0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
12fe0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
12ff0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13000 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
13010 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  , 0, addrEofA);.
13020 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
13030 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
13040 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
13050 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
13060 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
13070 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
13080 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
13090 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
130a0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
130b0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
130c0 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
130d0 66 41 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  fA;.  }else{  . 
130e0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
130f0 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75  nt((v, "eof-B su
13100 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
13110 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69   addrEofB = sqli
13120 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13130 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
13140 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
13150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13160 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
13170 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
13180 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13190 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
131a0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
131b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
131c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
131d0 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b  o, 0, addrEofB);
131e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
131f0 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
13200 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
13210 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  <B.  */.  VdbeNo
13220 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
13230 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -lt-B subroutine
13240 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20  "));.  addrAltB 
13250 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13260 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
13270 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
13280 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
13290 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
132a0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
132b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
132c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
132d0 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
132e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
132f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
13300 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
13310 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
13320 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
13330 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42  the case of A==B
13340 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
13350 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64  TK_ALL ){.    ad
13360 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
13370 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  B;.  }else if( o
13380 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
13390 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
133a0 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20  = addrAltB;.    
133b0 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65  addrAltB++;.  }e
133c0 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  lse{.    VdbeNoo
133d0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
133e0 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  eq-B subroutine"
133f0 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42  ));.    addrAeqB
13400 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   =.    sqlite3Vd
13410 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
13420 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b  ield, regAddrA);
13430 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13440 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
13450 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f   regEofA, addrEo
13460 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fA);.    sqlite3
13470 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13480 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
13490 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  mpr);.  }..  /* 
134a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
134b0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
134c0 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56   of A>B.  */.  V
134d0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
134e0 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f  v, "A-gt-B subro
134f0 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
13500 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AgtB = sqlite3Vd
13510 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
13520 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
13530 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
13540 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ON ){.    sqlite
13550 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13560 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
13570 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d  , addrOutB);.  }
13580 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13590 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
135a0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73  , regAddrB);.  s
135b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
135c0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
135d0 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  fB, addrEofB);. 
135e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
135f0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
13600 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
13610 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
13620 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
13630 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
13640 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
13650 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
13660 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  j1);.  sqlite3Vd
13670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13680 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f  nteger, 0, regEo
13690 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
136a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
136b0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f  nteger, 0, regEo
136c0 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fB);.  sqlite3Vd
136d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
136e0 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c 20  osub, regAddrA, 
136f0 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20  addrSelectA);.  
13700 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13710 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
13720 65 67 41 64 64 72 42 2c 20 61 64 64 72 53 65 6c  egAddrB, addrSel
13730 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  ectB);.  sqlite3
13740 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13750 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64  _If, regEofA, ad
13760 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  drEofA);.  sqlit
13770 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13780 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20  OP_If, regEofB, 
13790 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a  addrEofB);..  /*
137a0 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d   Implement the m
137b0 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20  ain merge loop. 
137c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
137d0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
137e0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73   labelCmpr);.  s
137f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13800 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  (v, OP_Permutati
13810 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  on, 0, 0, 0, (ch
13820 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34  ar*)aPermute, P4
13830 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71  _INTARRAY);.  sq
13840 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13850 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64  v, OP_Compare, d
13860 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42  estA.iMem, destB
13870 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72 42 79 2c  .iMem, nOrderBy,
13880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13890 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
138a0 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
138b0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
138c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
138d0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
138e0 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
138f0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a  eqB, addrAgtB);.
13900 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 65  .  /* Release te
13910 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
13920 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  s.  */.  if( reg
13930 50 72 65 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  Prev ){.    sqli
13940 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
13950 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 50  nge(pParse, regP
13960 72 65 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31 29  rev, nOrderBy+1)
13970 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
13980 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
13990 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
139a0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
139b0 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
139c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
139d0 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
139e0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
139f0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
13a00 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
13a10 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
13a20 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
13a30 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
13a40 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  t = pPrior;.    
13a50 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
13a60 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
13a70 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
13a80 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
13a90 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
13aa0 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
13ab0 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  st);.  }..  /* R
13ac0 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f  eassembly the co
13ad0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20  mpound query so 
13ae0 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
13af0 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  freed correctly.
13b00 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
13b10 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
13b20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
13b30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
13b40 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
13b50 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  ->pPrior);.  }. 
13b60 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
13b70 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  ior;..  /*** TBD
13b80 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
13b90 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
13ba0 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
13bb0 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
13bc0 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
13bd0 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  /.  return SQLIT
13be0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
13bf0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
13c00 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
13c10 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
13c20 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
13c30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c  ./* Forward Decl
13c40 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  arations */.stat
13c50 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
13c60 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20  rList(sqlite3*, 
13c70 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20  ExprList*, int, 
13c80 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
13c90 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
13ca0 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65  ect(sqlite3*, Se
13cb0 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
13cc0 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  rList *);../*.**
13cd0 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
13ce0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
13cf0 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
13d00 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
13d10 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
13d20 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
13d30 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
13d40 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
13d50 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
13d60 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
13d70 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
13d80 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
13d90 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
13da0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13db0 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
13dc0 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
13dd0 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
13de0 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
13df0 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
13e00 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
13e10 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
13e20 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
13e30 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
13e40 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
13e50 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
13e60 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
13e70 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
13e80 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
13e90 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68   routine make th
13ea0 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
13eb0 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
13ec0 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
13ed0 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
13ee0 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
13ef0 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
13f00 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
13f10 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
13f20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
13f30 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45  tic Expr *substE
13f40 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
13f50 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65  db,        /* Re
13f60 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
13f70 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65  rs to this conne
13f80 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
13f90 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
13fa0 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20  * Expr in which 
13fb0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63  substitution occ
13fc0 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  urs */.  int iTa
13fd0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ble,         /* 
13fe0 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
13ff0 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
14000 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
14010 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65   /* Substitute e
14020 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b  xpressions */.){
14030 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
14040 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
14050 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
14060 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
14070 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
14080 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
14090 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
140a0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
140b0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
140c0 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
140d0 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
140e0 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
140f0 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
14100 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
14110 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14120 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
14130 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
14140 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
14150 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
14160 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61  up(db, pEList->a
14170 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
14180 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
14190 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 70 45    if( pNew && pE
141a0 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20  xpr->pColl ){.  
141b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c        pNew->pCol
141c0 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
141d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
141e0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
141f0 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
14200 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77      pExpr = pNew
14210 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
14220 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  .    pExpr->pLef
14230 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
14240 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14250 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
14260 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  .    pExpr->pRig
14270 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ht = substExpr(d
14280 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
14290 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
142a0 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
142b0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
142c0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
142d0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
142e0 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  lect(db, pExpr->
142f0 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  x.pSelect, iTabl
14300 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
14310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62  }else{.      sub
14320 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
14330 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  Expr->x.pList, i
14340 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14350 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14360 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74  rn pExpr;.}.stat
14370 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
14380 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33  rList(.  sqlite3
14390 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
143a0 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
143b0 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
143c0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
143d0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
143e0 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63  scan and in whic
143f0 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
14400 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tutes */.  int i
14410 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
14420 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73  /* Table to be s
14430 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20  ubstituted */.  
14440 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
14450 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
14460 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  te values */.){.
14470 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
14480 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
14490 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
144a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
144b0 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
144c0 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74  i].pExpr = subst
144d0 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Expr(db, pList->
144e0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
144f0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
14500 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
14510 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71  ubstSelect(.  sq
14520 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
14530 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
14540 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
14550 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
14560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
14570 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
14580 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
14590 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a  ubstitutions */.
145a0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
145b0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
145c0 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a  to be replaced *
145d0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
145e0 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
145f0 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
14600 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
14610 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Src;.  struct Sr
14620 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
14630 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
14640 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
14650 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
14660 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54  b, p->pEList, iT
14670 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
14680 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
14690 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
146a0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
146b0 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
146c0 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
146d0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
146e0 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  );.  p->pHaving 
146f0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
14700 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62  p->pHaving, iTab
14710 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70  le, pEList);.  p
14720 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
14730 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65  Expr(db, p->pWhe
14740 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  re, iTable, pELi
14750 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65  st);.  substSele
14760 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  ct(db, p->pPrior
14770 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14780 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  );.  pSrc = p->p
14790 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
147a0 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20  Src );  /* Even 
147b0 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77  for (SELECT 1) w
147c0 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20  e have: pSrc!=0 
147d0 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d  but pSrc->nSrc==
147e0 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59  0 */.  if( ALWAY
147f0 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66  S(pSrc) ){.    f
14800 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c  or(i=pSrc->nSrc,
14810 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20   pItem=pSrc->a; 
14820 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
14830 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53  +){.      substS
14840 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d  elect(db, pItem-
14850 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  >pSelect, iTable
14860 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
14870 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
14880 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14890 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
148a0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
148b0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
148c0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
148d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
148e0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
148f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
14900 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  W)./*.** This ro
14910 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
14920 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
14930 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ries in order to
14940 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74   speed.** execut
14950 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ion.  It returns
14960 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
14970 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
14980 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a  no flattening.**
14990 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
149a0 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
149b0 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
149c0 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
149d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
149e0 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
149f0 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
14a00 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
14a10 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
14a20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
14a30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
14a40 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
14a50 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
14a60 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
14a70 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
14a80 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
14a90 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
14aa0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14ab0 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
14ac0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
14ad0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
14ae0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
14af0 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
14b00 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
14b10 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
14b20 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
14b30 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
14b40 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
14b50 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
14b60 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
14b70 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
14b80 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
14b90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
14ba0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
14bb0 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
14bc0 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
14bd0 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
14be0 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
14bf0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
14c00 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
14c10 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
14c20 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
14c30 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
14c40 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
14c50 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
14c60 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
14c70 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
14c80 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
14c90 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
14ca0 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
14cb0 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
14cc0 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
14cd0 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
14ce0 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
14cf0 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
14d00 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
14d10 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
14d20 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
14d30 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
14d40 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
14d50 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
14d60 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
14d70 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
14d80 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
14d90 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
14da0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
14db0 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
14dc0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14dd0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
14de0 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
14df0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
14e00 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
14e10 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
14e20 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20  r join.**       
14e30 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63   (Originally tic
14e40 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e  ket #306.  Stren
14e50 67 68 74 65 6e 65 64 20 62 79 20 74 69 63 6b 65  ghtened by ticke
14e60 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20  t #3300).**.**  
14e70 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
14e80 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
14e90 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
14ea0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
14eb0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  oin..**.**   (5)
14ec0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
14ed0 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
14ee0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
14ef0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
14f00 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
14f10 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  tes..**.**   (6)
14f20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
14f30 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
14f40 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
14f50 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
14f60 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
14f70 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
14f80 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
14f90 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
14fa0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
14fb0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
14fc0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
14fd0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
14fe0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
14ff0 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
15000 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
15010 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
15020 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
15030 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
15040 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
15050 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20  es..**.**  (10) 
15060 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
15070 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
15080 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
15090 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
150a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
150b0 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
150c0 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
150d0 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
150e0 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
150f0 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
15100 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
15110 31 32 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65  12)  Not impleme
15120 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20  nted.  Subsumed 
15130 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  into restriction
15140 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69   (3).  Was previ
15150 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ously.**        
15160 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72  a separate restr
15170 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20  iction deriving 
15180 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30  from ticket #350
15190 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ..**.**  (13)  T
151a0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
151b0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
151c0 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
151d0 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54  T.**.**  (14)  T
151e0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
151f0 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a   not use OFFSET.
15200 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65  **.**  (15)  The
15210 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
15220 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  not part of a co
15230 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72  mpound select or
15240 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
15250 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
15260 20 68 61 76 65 20 62 6f 74 68 20 61 6e 20 4f 52   have both an OR
15270 44 45 52 20 42 59 20 61 6e 64 20 61 20 4c 49 4d  DER BY and a LIM
15280 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20  IT clause..**   
15290 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
152a0 20 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 20 28   #2339).**.**  (
152b0 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  16)  The outer q
152c0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
152d0 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
152e0 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a  subquery does.**
152f0 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74          not cont
15300 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28  ain ORDER BY.  (
15310 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54  Ticket #2942)  T
15320 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20  his used to not 
15330 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  matter.**       
15340 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64   until we introd
15350 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63  uced the group_c
15360 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e  oncat() function
15370 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20  .  .**.**  (17) 
15380 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   The sub-query i
15390 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  s not a compound
153a0 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69   select, or it i
153b0 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a  s a UNION ALL .*
153c0 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
153d0 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70  d clause made up
153e0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e   entirely of non
153f0 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
15400 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  es, and .**     
15410 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75     the parent qu
15420 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ery:.**.**      
15430 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73      * is not its
15440 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f  elf part of a co
15450 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a  mpound select,.*
15460 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
15470 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
15480 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65   or DISTINCT que
15490 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ry, and.**      
154a0 20 20 20 20 2a 20 68 61 73 20 6e 6f 20 6f 74 68      * has no oth
154b0 65 72 20 74 61 62 6c 65 73 20 6f 72 20 73 75 62  er tables or sub
154c0 2d 73 65 6c 65 63 74 73 20 69 6e 20 74 68 65 20  -selects in the 
154d0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
154e0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
154f0 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
15500 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
15510 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
15520 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
15530 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
15540 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
15550 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
15560 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
15570 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
15580 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
15590 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49  ..**.**  (18)  I
155a0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
155b0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
155c0 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74  lect, then all t
155d0 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20  erms of the.**  
155e0 20 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63        ORDER by c
155f0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72  lause of the par
15600 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70  ent must be simp
15610 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
15620 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75   .**        colu
15630 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71  mns of the sub-q
15640 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39  uery..**.**  (19
15650 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
15660 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
15670 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
15680 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
15690 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
156a0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
156b0 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
156c0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
156d0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
156e0 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
156f0 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
15700 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
15710 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
15720 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
15730 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
15740 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
15750 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
15760 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
15770 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
15780 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
15790 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
157a0 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
157b0 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
157c0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
157d0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ut.**        hav
157e0 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61  e other optimiza
157f0 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f  tions in mind to
15800 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20   deal with that 
15810 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  case..**.** In t
15820 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
15830 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
15840 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
15850 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
15860 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
15870 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
15880 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
15890 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
158a0 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
158b0 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
158c0 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
158d0 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
158e0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
158f0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
15900 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
15910 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
15920 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
15930 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
15940 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
15950 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
15960 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
15970 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
15980 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
15990 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
159a0 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
159b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
159c0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
159d0 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
159e0 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
159f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
15a00 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
15a10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15a20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
15a30 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
15a40 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
15a50 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
15a60 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
15a70 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
15a80 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
15a90 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
15aa0 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
15ab0 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
15ac0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
15ad0 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
15ae0 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
15af0 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
15b00 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
15b10 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
15b20 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
15b30 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
15b40 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
15b50 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
15b60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
15b70 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
15b80 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
15b90 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
15ba0 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65  *pParent;.  Sele
15bb0 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
15bc0 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
15bd0 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
15be0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
15bf0 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  ub1;      /* Poi
15c00 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
15c10 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20  tmost select in 
15c20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53  sub-query */.  S
15c30 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
15c40 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
15c50 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
15c60 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
15c70 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
15c80 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
15c90 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
15ca0 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
15cb0 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
15cc0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
15cd0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
15ce0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
15cf0 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
15d00 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
15d10 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
15d20 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
15d30 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d50 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
15d60 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
15d90 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
15da0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
15db0 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
15dc0 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
15dd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15de0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
15df0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
15e00 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
15e10 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
15e20 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
15e30 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
15e40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
15e50 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f  >pPrior==0 );  /
15e60 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74  * Unable to flat
15e70 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  ten compound que
15e80 72 69 65 73 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ries */.  pSrc =
15e90 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
15ea0 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
15eb0 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
15ec0 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
15ed0 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
15ee0 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
15ef0 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
15f00 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
15f10 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
15f20 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
15f30 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
15f40 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72  isAgg && subquer
15f50 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
15f60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
15f70 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
15f80 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (1)  */.  if( 
15f90 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
15fa0 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
15fb0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
15fc0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
15fd0 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62  n (2)  */.  pSub
15fe0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
15ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
16000 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
16010 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
16020 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
16030 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
16040 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
16050 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
16060 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
16070 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65  sions, we allowe
16080 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67  d some combining
16090 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   of LIMIT and OF
160a0 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73  FSET.  ** becaus
160b0 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20  e they could be 
160c0 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70  computed at comp
160d0 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77  ile-time.  But w
160e0 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
160f0 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65  FSET.  ** became
16100 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
16110 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20  ssions, we were 
16120 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65  forced to add re
16130 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a  strictions (13).
16140 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a    ** and (14). *
16150 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
16160 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69  imit && p->pLimi
16170 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
16180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16190 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a  striction (13) *
161a0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  /.  if( pSub->pO
161b0 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30  ffset ) return 0
161c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
161d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
161e0 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a  striction (14) *
161f0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  /.  if( p->pRigh
16200 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70  tmost && pSub->p
16210 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70  Limit && pSub->p
16220 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
16230 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
16270 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
16280 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
16290 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
162a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
162b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
162c0 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
162d0 20 69 66 28 20 28 28 70 53 75 62 2d 3e 73 65 6c   if( ((pSub->sel
162e0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
162f0 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 75 62 2d  nct)!=0 || pSub-
16300 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  >pLimit) .      
16310 20 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72     && (pSrc->nSr
16320 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
16330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16340 74 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35 29  trictions (4)(5)
16350 28 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20 72  (8)(9) */.     r
16360 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 0a  eturn 0;       .
16370 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65    }.  if( (p->se
16380 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
16390 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71  inct)!=0 && subq
163a0 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
163b0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
163c0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
163d0 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20  on (6)  */.  }. 
163e0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
163f0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
16400 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
16410 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16440 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
16450 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
16460 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70  isAgg && pSub->p
16470 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
16480 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16490 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
164a0 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20  n (16) */.  if( 
164b0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
164c0 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
164d0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
164e0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
164f0 6e 20 28 31 39 29 20 2a 2f 0a 0a 20 20 2f 2a 20  n (19) */..  /* 
16500 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
16510 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63   1:.  ** Restric
16520 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
16530 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
16540 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
16550 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
16560 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
16570 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
16580 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
16590 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
165a0 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
165b0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
165c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
165d0 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
165e0 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
165f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
16600 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
16610 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
16620 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
16630 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
16640 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
16650 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
16660 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
16670 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
16680 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c  .  **.  ** OBSOL
16690 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20  ETE COMMENT 2:. 
166a0 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
166b0 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
166c0 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
166d0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
166e0 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
166f0 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
16700 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
16710 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
16720 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
16730 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
16740 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
16750 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
16760 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
16770 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
16780 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
16790 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
167a0 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
167b0 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
167c0 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
167d0 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
167e0 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
167f0 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
16800 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
16810 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
16820 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
16830 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
16840 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
16850 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
16860 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
16870 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
16880 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20  .  **.  ** THIS 
16890 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45  OVERRIDES OBSOLE
168a0 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e  TE COMMENTS 1 AN
168b0 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20  D 2 ABOVE:.  ** 
168c0 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f  Ticket #3300 sho
168d0 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69  ws that flatteni
168e0 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ng the right ter
168f0 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
16900 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74  .  ** is fraught
16910 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42   with danger.  B
16920 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65  est to avoid the
16930 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49   whole thing.  I
16940 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  f the.  ** subqu
16950 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
16960 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
16970 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  JOIN, then do no
16980 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a  t flatten..  */.
16990 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
169a0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  >jointype & JT_O
169b0 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
169c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
169d0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
169e0 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  17: If the sub-q
169f0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
16a00 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
16a10 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
16a20 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
16a30 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
16a40 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
16a50 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
16a60 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
16a70 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
16a80 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
16a90 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
16aa0 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
16ab0 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
16ac0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
16ad0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
16ae0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
16af0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
16b00 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
16b10 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d  tion 20 */.    }
16b20 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
16b30 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
16b40 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
16b50 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
16b60 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
16b70 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 0;.    }.    f
16b80 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
16b90 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
16ba0 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
16bb0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
16bc0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
16bd0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
16be0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
16bf0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
16c00 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
16c10 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
16c20 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
16c30 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
16c40 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
16c50 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c   if( (pSub1->sel
16c60 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
16c70 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
16c80 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  e))!=0.       ||
16c90 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20   (pSub1->pPrior 
16ca0 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b  && pSub1->op!=TK
16cb0 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c  _ALL) .       ||
16cc0 20 4e 45 56 45 52 28 70 53 75 62 31 2d 3e 70 53   NEVER(pSub1->pS
16cd0 72 63 3d 3d 30 29 20 7c 7c 20 70 53 75 62 31 2d  rc==0) || pSub1-
16ce0 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a 20  >pSrc->nSrc!=1. 
16cf0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16d00 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
16d10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
16d20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20  Restriction 18. 
16d30 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
16d40 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
16d50 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
16d60 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
16d70 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
16d80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
16d90 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
16da0 5b 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20 72  [ii].iCol==0 ) r
16db0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
16dc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16dd0 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
16de0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
16df0 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
16e00 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20  tted. *****/..  
16e10 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65  /* Authorize the
16e20 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
16e30 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
16e40 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ext = pSubitem->
16e50 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  zName;.  sqlite3
16e60 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
16e70 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
16e80 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50 61   0, 0, 0);.  pPa
16e90 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
16ea0 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
16eb0 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
16ec0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
16ed0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
16ee0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
16ef0 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
16f00 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
16f10 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
16f20 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
16f30 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
16f40 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
16f50 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
16f60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
16f70 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
16f80 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
16f90 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
16fa0 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
16fb0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
16fc0 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
16fd0 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
16fe0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
16ff0 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
17000 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
17010 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
17020 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
17030 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
17040 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
17050 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
17060 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
17070 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
17080 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
17090 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
170a0 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
170b0 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
170c0 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
170d0 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
170e0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
170f0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
17100 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
17110 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
17120 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
17130 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
17140 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
17150 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
17160 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
17170 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
17180 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
17190 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
171a0 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
171b0 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
171c0 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
171d0 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
171e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
171f0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
17200 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
17210 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
17220 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
17230 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
17240 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
17250 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
17260 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
17270 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
17280 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
17290 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
172a0 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
172b0 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
172c0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
172d0 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
172e0 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
172f0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
17300 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
17310 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
17320 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
17330 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
17340 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
17350 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
17360 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
17370 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
17380 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
17390 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
173a0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
173b0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
173c0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
173d0 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
173e0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
173f0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
17400 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
17410 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c  SelectDup(db, p,
17420 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d   0);.    p->pLim
17430 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
17440 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
17450 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e  OrderBy;.    p->
17460 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
17470 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b   p->op = TK_ALL;
17480 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f  .    p->pRightmo
17490 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  st = 0;.    if( 
174a0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
174b0 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a   pNew = pPrior;.
174c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
174d0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
174e0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e  pPrior;.      pN
174f0 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  ew->pRightmost =
17500 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d   0;.    }.    p-
17510 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a  >pPrior = pNew;.
17520 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
17530 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
17540 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
17550 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
17560 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
17570 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
17580 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
17590 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
175a0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
175b0 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
175c0 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
175d0 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
175e0 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
175f0 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
17600 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
17610 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
17620 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
17630 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
17640 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
17650 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
17660 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
17670 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
17680 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
17690 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
176a0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
176b0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
176c0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
176d0 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
176e0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
176f0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
17700 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
17710 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
17720 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
17730 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
17740 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
17750 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
17760 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
17770 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
17780 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
17790 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
177a0 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
177b0 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
177c0 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
177d0 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
177e0 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
177f0 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
17800 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
17810 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
17820 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
17830 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
17840 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
17850 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
17860 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
17870 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
17880 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65  ( pTabToDel->nRe
17890 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
178a0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
178b0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
178c0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
178d0 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
178e0 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
178f0 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
17900 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
17910 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
17920 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
17930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17940 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d  TabToDel->nRef--
17950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
17960 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
17970 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
17980 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
17990 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
179a0 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
179b0 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
179c0 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
179d0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
179e0 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
179f0 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
17a00 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
17a10 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
17a20 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
17a30 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
17a40 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
17a50 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
17a60 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
17a70 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
17a80 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
17a90 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
17aa0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
17ab0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
17ac0 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
17ad0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
17ae0 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
17af0 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
17b00 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
17b10 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
17b20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
17b30 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
17b40 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
17b50 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
17b60 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
17b70 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
17b80 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
17b90 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
17ba0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
17bb0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
17bc0 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
17bd0 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
17be0 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
17bf0 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
17c00 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
17c10 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
17c20 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
17c30 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
17c40 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
17c50 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
17c60 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
17c70 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
17c80 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
17c90 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
17ca0 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
17cb0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
17cc0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
17cd0 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
17ce0 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
17cf0 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
17d00 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
17d10 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
17d20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
17d30 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
17d40 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
17d50 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
17d60 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
17d70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17d80 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
17d90 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
17da0 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
17db0 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
17dc0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
17dd0 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
17de0 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
17df0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
17e00 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
17e10 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
17e20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
17e30 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
17e40 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
17e50 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
17e60 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
17e70 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
17e80 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
17e90 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
17ea0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
17eb0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
17ec0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
17ed0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
17ee0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
17ef0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
17f00 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
17f10 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
17f20 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
17f30 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
17f40 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
17f50 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
17f60 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
17f70 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
17f80 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
17f90 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
17fa0 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
17fb0 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
17fc0 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
17fd0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
17fe0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
17ff0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
18000 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
18010 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
18020 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
18030 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
18040 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
18050 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
18060 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
18070 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
18080 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
18090 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
180a0 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
180b0 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
180c0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
180d0 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
180e0 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
180f0 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71  expand the out q
18100 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e  uery to 4 slots.
18110 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20    The middle.   
18120 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61   ** slot is expa
18130 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
18140 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
18150 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ke space for the
18160 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d  .    ** two elem
18170 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
18180 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
18190 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
181a0 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
181b0 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
181c0 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
181d0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
181e0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
181f0 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
18200 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
18210 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18220 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
18230 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
18240 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
18250 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
18260 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
18270 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
18280 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
18290 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
182a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
182b0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
182c0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
182d0 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
182e0 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
182f0 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  g);.      pSrc->
18300 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
18310 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
18320 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
18330 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
18340 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
18350 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
18360 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
18370 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
18380 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
18390 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
183a0 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
183b0 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
183c0 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
183d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
183e0 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
183f0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
18400 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
18410 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
18420 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
18430 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
18440 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
18450 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
18460 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
18470 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
18480 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
18490 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
184a0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
184b0 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
184c0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
184d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
184e0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
184f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18500 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
18510 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
18520 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
18530 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
18540 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
18550 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
18560 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
18570 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
18580 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
18590 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
185a0 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
185b0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61  .    pList = pPa
185c0 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  rent->pEList;.  
185d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
185e0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
185f0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
18600 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
18610 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
18620 20 63 68 61 72 20 2a 7a 53 70 61 6e 20 3d 20 70   char *zSpan = p
18630 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
18640 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c  ;.        if( AL
18650 57 41 59 53 28 7a 53 70 61 6e 29 20 29 7b 0a 20  WAYS(zSpan) ){. 
18660 20 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e           pList->
18670 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
18680 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
18690 20 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20   zSpan);.       
186a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
186b0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
186c0 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
186d0 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
186e0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
186f0 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b      if( isAgg ){
18700 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
18710 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
18720 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
18730 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
18740 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
18750 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
18760 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
18770 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
18780 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
18790 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
187a0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
187b0 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
187c0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  t( pParent->pOrd
187d0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
187e0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
187f0 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
18800 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
18810 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
18820 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
18830 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29  rent->pOrderBy )
18840 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
18850 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
18860 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  t->pOrderBy, iPa
18870 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
18880 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
18890 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
188a0 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20  ){.      pWhere 
188b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
188c0 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
188d0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
188e0 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
188f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
18900 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
18910 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18920 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
18930 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  g==0 );.      pP
18940 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
18950 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
18960 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
18970 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
18980 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
18990 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
189a0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
189b0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
189c0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
189d0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
189e0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
189f0 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
18a00 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
18a10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
18a40 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
18a50 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20  ving, 0));.     
18a60 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
18a70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
18a80 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
18a90 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
18aa0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
18ab0 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  , pSub->pGroupBy
18ac0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
18ad0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
18ae0 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
18af0 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
18b00 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
18b10 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
18b20 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
18b30 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
18b40 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
18b50 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65  nt->pWhere, pWhe
18b60 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  re);.    }.  .  
18b70 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
18b80 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
18b90 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
18ba0 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
18bb0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
18bc0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
18bd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
18be0 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ent->selFlags |=
18bf0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
18c00 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20  & SF_Distinct;. 
18c10 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20   .    /*.    ** 
18c20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
18c30 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
18c40 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
18c50 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
18c60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
18c70 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20  e is tempted to 
18c80 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64  try to add a and
18c90 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68   b to combine th
18ca0 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74  e limits.  But t
18cb0 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20  his.    ** does 
18cc0 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68  not work if eith
18cd0 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  er limit is nega
18ce0 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
18cf0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
18d00 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  t ){.      pPare
18d10 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75  nt->pLimit = pSu
18d20 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  b->pLimit;.     
18d30 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
18d40 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
18d50 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c  /* Finially, del
18d60 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74  ete what is left
18d70 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
18d80 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a   and return.  **
18d90 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   success..  */. 
18da0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
18db0 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b  lete(db, pSub1);
18dc0 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
18dd0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
18de0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
18df0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
18e00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
18e10 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _VIEW) */../*.**
18e20 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c   Analyze the SEL
18e30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ECT statement pa
18e40 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
18e50 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74  ent to see if it
18e60 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29 20 6f  .** is a min() o
18e70 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 52  r max() query. R
18e80 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
18e90 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45  RBY_MIN or WHERE
18ea0 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 69 66 20  _ORDERBY_MAX if 
18eb0 0a 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20 30 20  .** it is, or 0 
18ec0 6f 74 68 65 72 77 69 73 65 2e 20 41 74 20 70 72  otherwise. At pr
18ed0 65 73 65 6e 74 2c 20 61 20 71 75 65 72 79 20 69  esent, a query i
18ee0 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  s considered to 
18ef0 62 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d 61  be.** a min()/ma
18f00 78 28 29 20 71 75 65 72 79 20 69 66 3a 0a 2a 2a  x() query if:.**
18f10 0a 2a 2a 20 20 20 31 2e 20 54 68 65 72 65 20 69  .**   1. There i
18f20 73 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63  s a single objec
18f30 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  t in the FROM cl
18f40 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e  ause..**.**   2.
18f50 20 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67   There is a sing
18f60 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  le expression in
18f70 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
18f80 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20 20   and it is.**   
18f90 20 20 20 65 69 74 68 65 72 20 6d 69 6e 28 78 29     either min(x)
18fa0 20 6f 72 20 6d 61 78 28 78 29 2c 20 77 68 65 72   or max(x), wher
18fb0 65 20 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  e x is a column 
18fc0 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74  reference..*/.st
18fd0 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75  atic u8 minMaxQu
18fe0 65 72 79 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ery(Select *p){.
18ff0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
19000 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
19010 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
19020 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
19030 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
19040 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
19050 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20  RMAL;.  pExpr = 
19060 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
19070 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  pr;.  if( pExpr-
19080 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
19090 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
190a0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 45 78 70  .  if( NEVER(Exp
190b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
190c0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
190d0 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  )) ) return 0;. 
190e0 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
190f0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
19100 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c  pEList==0 || pEL
19110 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
19120 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
19130 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
19140 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43  pr->op!=TK_AGG_C
19150 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57  OLUMN ) return W
19160 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
19170 4d 41 4c 3b 0a 20 20 61 73 73 65 72 74 28 20 21  MAL;.  assert( !
19180 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
19190 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
191a0 75 65 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ue) );.  if( sql
191b0 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
191c0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 69 6e  r->u.zToken,"min
191d0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")==0 ){.    ret
191e0 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
191f0 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  Y_MIN;.  }else i
19200 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
19210 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
19220 6e 2c 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20  n,"max")==0 ){. 
19230 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f     return WHERE_
19240 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d  ORDERBY_MAX;.  }
19250 0a 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f  .  return WHERE_
19260 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
19270 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
19280 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
19290 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
192a0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
192b0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
192c0 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  ..** The second 
192d0 61 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61  argment is the a
192e0 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
192f0 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
19300 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
19310 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
19320 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
19330 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
19340 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
19350 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
19360 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
19370 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
19380 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
19390 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
193a0 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
193b0 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
193c0 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
193d0 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
193e0 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
193f0 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
19400 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
19410 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
19420 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
19430 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
19440 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
19450 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
19460 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
19470 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
19480 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
19490 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
194a0 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
194b0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
194c0 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
194d0 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
194e0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
194f0 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
19500 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
19510 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
19520 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
19530 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
19540 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
19550 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
19560 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
19570 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
19580 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
19590 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
195a0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
195b0 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
195c0 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67  rn 0;.  if( (pAg
195d0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
195e0 70 46 75 6e 63 2d 3e 66 6c 61 67 73 26 53 51 4c  pFunc->flags&SQL
195f0 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
19600 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
19610 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
19620 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20  s&EP_Distinct ) 
19630 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
19640 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
19650 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
19660 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
19670 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
19680 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
19690 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
196a0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
196b0 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
196c0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
196d0 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
196e0 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
196f0 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
19700 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
19710 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
19720 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
19730 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
19740 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
19750 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
19760 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
19770 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
19780 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
19790 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
197a0 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
197b0 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
197c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
197d0 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
197e0 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
197f0 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61  zIndex ){.    Ta
19800 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
19810 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61  m->pTab;.    cha
19820 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f  r *zIndex = pFro
19830 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49  m->zIndex;.    I
19840 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
19850 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
19860 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20  Index; .        
19870 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53  pIdx && sqlite3S
19880 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61  trICmp(pIdx->zNa
19890 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20  me, zIndex); .  
198a0 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
198b0 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
198c0 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
198d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
198e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
198f0 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
19900 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20  , zIndex, 0);.  
19910 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19920 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
19930 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78     pFrom->pIndex
19940 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
19950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
19970 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
19980 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
19990 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
199a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
199b0 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
199c0 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
199d0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
199e0 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
199f0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
19a00 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
19a10 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
19a20 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
19a30 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
19a40 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
19a50 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
19a60 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
19a70 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
19a80 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
19a90 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
19aa0 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
19ab0 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
19ac0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
19ad0 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
19ae0 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
19af0 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
19b00 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
19b10 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
19b20 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
19b30 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
19b40 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
19b50 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
19b60 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
19b70 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
19b80 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
19b90 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
19ba0 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
19bb0 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
19bc0 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
19bd0 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
19be0 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
19bf0 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
19c00 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
19c10 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
19c20 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
19c30 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
19c40 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
19c50 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
19c60 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
19c70 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
19c80 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
19c90 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
19ca0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
19cb0 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
19cc0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
19cd0 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
19ce0 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
19cf0 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
19d00 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
19d10 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
19d20 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
19d30 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
19d40 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
19d50 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
19d60 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
19d70 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
19d80 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
19d90 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
19da0 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
19db0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
19dc0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61  electExpander(Wa
19dd0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
19de0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
19df0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
19e00 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
19e10 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53  int i, j, k;.  S
19e20 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
19e30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
19e40 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
19e50 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
19e60 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
19e70 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
19e80 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
19e90 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20  cFailed  ){.    
19ea0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
19eb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45  ;.  }.  if( NEVE
19ec0 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c  R(p->pSrc==0) ||
19ed0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
19ee0 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
19ef0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
19f00 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
19f10 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
19f20 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54 61  _Expanded;.  pTa
19f30 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
19f40 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
19f50 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
19f60 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
19f70 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
19f80 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
19f90 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
19fa0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19fb0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
19fc0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
19fd0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
19fe0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
19ff0 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
1a000 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
1a010 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
1a020 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1a030 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
1a040 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
1a050 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
1a060 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
1a070 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
1a080 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
1a090 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
1a0a0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
1a0b0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
1a0c0 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
1a0d0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
1a0e0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1a0f0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1a100 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1a110 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
1a120 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
1a130 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
1a140 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1a150 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
1a160 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
1a170 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
1a180 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
1a190 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
1a1a0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
1a1b0 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
1a1c0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1a1d0 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ne;.    }.    if
1a1e0 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
1a1f0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
1a200 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1a210 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
1a220 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
1a230 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
1a240 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
1a250 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1a260 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
1a270 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
1a280 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1a290 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
1a2a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1a2b0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
1a2c0 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
1a2d0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
1a2e0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
1a2f0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1a300 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
1a310 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
1a320 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1a330 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
1a340 61 62 2d 3e 64 62 4d 65 6d 20 3d 20 64 62 2d 3e  ab->dbMem = db->
1a350 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
1a360 65 64 20 3f 20 64 62 20 3a 20 30 3b 0a 20 20 20  ed ? db : 0;.   
1a370 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
1a380 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  1;.      pTab->z
1a390 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
1a3a0 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
1a3b0 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c  e_subquery_%p_",
1a3c0 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20   (void*)pTab);. 
1a3d0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
1a3e0 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c  ->pPrior ){ pSel
1a3f0 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
1a400 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43   }.      selectC
1a410 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
1a420 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
1a430 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
1a440 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
1a450 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
1a460 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
1a470 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
1a480 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
1a490 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
1a4a0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
1a4b0 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
1a4c0 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
1a4d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
1a4e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1a4f0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
1a500 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
1a510 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
1a520 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
1a530 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
1a540 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70  0,pFrom->zName,p
1a550 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  From->zDatabase)
1a560 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
1a570 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1a580 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
1a590 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
1a5a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1a5b0 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
1a5c0 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
1a5d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1a5e0 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
1a5f0 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
1a600 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
1a610 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
1a620 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
1a630 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
1a640 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
1a650 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
1a660 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
1a670 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
1a680 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
1a690 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
1a6a0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1a6b0 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
1a6c0 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
1a6d0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
1a6e0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
1a6f0 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
1a700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1a710 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
1a720 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
1a730 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
1a740 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
1a750 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
1a760 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
1a770 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1a780 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
1a790 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
1a7a0 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
1a7b0 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
1a7c0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
1a7d0 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
1a7e0 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
1a7f0 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
1a800 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
1a810 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
1a820 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
1a830 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
1a840 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
1a850 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
1a860 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1a870 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
1a880 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
1a890 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
1a8a0 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
1a8b0 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
1a8c0 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
1a8d0 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
1a8e0 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
1a8f0 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
1a900 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
1a910 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
1a920 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
1a930 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
1a940 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
1a950 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
1a960 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
1a970 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
1a980 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
1a990 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
1a9a0 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
1a9b0 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
1a9c0 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
1a9d0 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
1a9e0 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
1a9f0 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
1aa00 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
1aa10 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
1aa20 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
1aa30 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
1aa40 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
1aa50 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
1aa60 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
1aa70 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
1aa80 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
1aa90 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
1aaa0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
1aab0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
1aac0 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
1aad0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
1aae0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
1aaf0 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
1ab00 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
1ab10 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30  || pE->pRight!=0
1ab20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ab30 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1ab40 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  | (pE->pLeft!=0 
1ab50 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
1ab60 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20  ==TK_ID) );.    
1ab70 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
1ab80 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
1ab90 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
1aba0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
1abb0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
1abc0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
1abd0 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
1abe0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
1abf0 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
1ac00 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
1ac10 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
1ac20 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1ac30 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
1ac40 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
1ac50 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
1ac60 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
1ac70 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
1ac80 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
1ac90 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
1aca0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1acb0 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
1acc0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
1acd0 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
1ace0 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
1acf0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
1ad00 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
1ad10 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
1ad20 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad40 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
1ad50 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
1ad60 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
1ad70 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
1ad80 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
1ad90 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1ada0 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
1adb0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
1adc0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
1add0 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
1ade0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
1adf0 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f  TK_ALL && (pE->o
1ae00 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
1ae10 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f  >pRight->op!=TK_
1ae20 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ALL) ){.        
1ae30 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
1ae40 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
1ae50 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1ae60 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
1ae70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
1ae80 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1ae90 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1aea0 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  se, pNew, a[k].p
1aeb0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1aec0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
1aed0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
1aee0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
1aef0 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
1af00 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1af10 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
1af20 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53  .zSpan = a[k].zS
1af30 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pan;.          a
1af40 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
1af50 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53           a[k].zS
1af60 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pan = 0;.       
1af70 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e   }.        a[k].
1af80 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
1af90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1afa0 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
1afb0 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
1afc0 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
1afd0 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
1afe0 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
1aff0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
1b000 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
1b010 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
1b020 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
1b030 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
1b040 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
1b050 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
1b060 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
1b070 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
1b080 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
1b090 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1b0a0 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
1b0b0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1b0c0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1b0d0 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
1b0e0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1b0f0 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
1b100 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
1b110 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
1b120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1b130 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   zTName = 0;.   
1b140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
1b150 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
1b160 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
1b170 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1b180 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
1b190 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
1b1a0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
1b1b0 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
1b1c0 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
1b1d0 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
1b1e0 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
1b1f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1b200 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
1b210 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
1b220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b230 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1b240 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
1b250 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
1b260 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
1b270 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
1b280 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
1b290 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1b2a0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
1b2b0 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65  .          table
1b2c0 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
1b2d0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1b2e0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
1b2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
1b300 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68  r *pExpr, *pRigh
1b310 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
1b320 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
1b330 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1b340 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
1b350 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ar *zColname;  /
1b360 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63  * The computed c
1b370 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
1b380 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1b390 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61  zToFree;   /* Ma
1b3a0 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68  lloced string th
1b3b0 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  at needs to be f
1b3c0 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  reed */.        
1b3d0 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61      Token sColna
1b3e0 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64  me;  /* Computed
1b3f0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20   column name as 
1b400 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20  a token */..    
1b410 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
1b420 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64  column is marked
1b430 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75   as 'hidden' (cu
1b440 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73  rrently only pos
1b450 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  sible.          
1b460 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c    ** for virtual
1b470 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74   tables), do not
1b480 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74   include it in t
1b490 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20  he expanded.    
1b4a0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c          ** resul
1b4b0 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20  t-set list..    
1b4c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b4d0 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64         if( IsHid
1b4e0 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d  denColumn(&pTab-
1b4f0 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20  >aCol[j]) ){.   
1b500 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1b510 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  t(IsVirtual(pTab
1b520 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
1b530 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1b540 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1b550 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
1b560 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
1b580 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1b590 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c   *pLeft = &pTabL
1b5a0 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20  ist->a[i-1];.   
1b5b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
1b5c0 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70  pLeft[1].jointyp
1b5d0 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
1b5e0 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1b600 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d  lumnIndex(pLeft-
1b610 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  >pTab, zName)>=0
1b620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b630 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
1b640 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
1b650 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
1b660 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
1b670 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
1b680 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  le on the right 
1b690 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1b6a0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1b6b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1b6c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1b6d0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
1b6e0 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e  x(pLeft[1].pUsin
1b6f0 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b710 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
1b720 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
1b730 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
1b740 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
1b750 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
1b760 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
1b770 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
1b780 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
1b790 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b7c0 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
1b7d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
1b7e0 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
1b7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
1b800 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  olname = zName;.
1b810 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
1b820 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ree = 0;.       
1b830 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
1b840 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
1b850 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
1b860 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
1b870 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
1b880 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
1b890 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
1b8a0 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
1b8b0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1b8c0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1b8d0 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
1b8e0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
1b8f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1b900 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
1b910 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b920 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
1b930 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1b940 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
1b950 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
1b960 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
1b970 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1b990 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1b9a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b9b0 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
1b9c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b9d0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
1b9e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1b9f0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1ba00 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
1ba10 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
1ba20 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  e.z = zColname;.
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
1ba40 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33  name.n = sqlite3
1ba50 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d  Strlen30(zColnam
1ba60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1ba70 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
1ba80 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
1ba90 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20  New, &sColname, 
1baa0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1bab0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1bac0 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  , zToFree);.    
1bad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bae0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
1baf0 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
1bb00 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
1bb10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1bb20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1bb30 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1bb40 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
1bb50 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1bb60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1bb70 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1bb80 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
1bb90 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
1bba0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1bbb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1bbc0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1bbd0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1bbe0 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
1bbf0 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
1bc00 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  ew;.  }.#if SQLI
1bc10 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
1bc20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  if( p->pEList &&
1bc30 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
1bc40 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
1bc50 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
1bc60 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
1bc70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1bc80 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
1bc90 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
1bca0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
1bcb0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1bcc0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
1bcd0 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
1bce0 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
1bcf0 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
1bd00 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1bd10 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
1bd20 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
1bd30 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1bd40 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
1bd50 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
1bd60 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
1bd70 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
1bd80 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
1bd90 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1bda0 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
1bdb0 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
1bdc0 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
1bdd0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1bde0 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
1bdf0 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
1be00 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
1be10 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
1be20 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61  ser tree..*/.sta
1be30 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b  tic int exprWalk
1be40 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
1be50 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
1be60 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
1be70 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
1be80 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
1be90 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1bea0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
1beb0 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
1bec0 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
1bed0 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
1bee0 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
1bef0 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
1bf00 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1bf10 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
1bf20 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
1bf30 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
1bf40 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
1bf50 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
1bf60 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
1bf70 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
1bf80 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
1bf90 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1bfa0 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
1bfb0 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
1bfc0 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
1bfd0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
1bfe0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1bff0 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
1c000 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
1c010 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
1c020 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
1c030 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
1c040 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
1c050 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
1c060 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
1c070 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
1c080 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
1c090 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
1c0a0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
1c0b0 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
1c0c0 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
1c0d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
1c0e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1c0f0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
1c100 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
1c110 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1c120 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
1c130 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
1c140 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
1c150 64 65 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  der;.  w.xExprCa
1c160 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
1c170 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
1c180 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
1c190 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1c1a0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a  &w, pSelect);.}.
1c1b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c1c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
1c1d0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57  *.** This is a W
1c1e0 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
1c1f0 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66  lback callback f
1c200 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65  or the sqlite3Se
1c210 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a  lectTypeInfo().*
1c220 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  * interface..**.
1c230 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d  ** For each FROM
1c240 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1c250 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79  , add Column.zTy
1c260 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43  pe and Column.zC
1c270 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  oll.** informati
1c280 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  on to the Table 
1c290 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
1c2a0 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
1c2b0 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74  sult set.** of t
1c2c0 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  hat subquery..**
1c2d0 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
1c2e0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
1c2f0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
1c300 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74  lt set was const
1c310 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c  ructed.** by sel
1c320 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75  ectExpander() bu
1c330 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63  t the type and c
1c340 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
1c350 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64  tion was omitted
1c360 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e  .** at that poin
1c370 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69  t because identi
1c380 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65  fiers had not ye
1c390 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  t been resolved.
1c3a0 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
1c3b0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
1c3c0 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73  r identifier res
1c3d0 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
1c3e0 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64  ic int selectAdd
1c3f0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
1c400 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1c410 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1c420 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
1c430 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
1c440 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
1c450 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1c460 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
1c470 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
1c480 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
1c490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
1c4a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
1c4b0 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29  asTypeInfo)==0 )
1c4c0 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
1c4d0 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
1c4e0 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
1c4f0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
1c500 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1c510 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  Src;.  for(i=0, 
1c520 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
1c530 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
1c540 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
1c550 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
1c560 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1c570 62 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  b;.    if( ALWAY
1c580 53 28 70 54 61 62 21 3d 30 29 20 26 26 20 28 70  S(pTab!=0) && (p
1c590 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
1c5a0 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
1c5b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73   ){.      /* A s
1c5c0 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
1c5d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1c5e0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
1c5f0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
1c600 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
1c610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1c620 65 6c 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  el );.      whil
1c630 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
1c640 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  ) pSel = pSel->p
1c650 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 65 6c  Prior;.      sel
1c660 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
1c670 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
1c680 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  rse, pTab->nCol,
1c690 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65   pTab->aCol, pSe
1c6a0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
1c6b0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1c6c0 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  nue;.}.#endif...
1c6d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1c6e0 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65  ne adds datatype
1c6f0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
1c700 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  equence informat
1c710 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61  ion to.** the Ta
1c720 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f  ble structures o
1c730 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  f all FROM-claus
1c740 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  e subqueries in 
1c750 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
1c760 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  ement..**.** Use
1c770 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66   this routine af
1c780 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
1c790 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1c7a0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1c7b0 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72  tAddTypeInfo(Par
1c7c0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
1c7d0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69  ct *pSelect){.#i
1c7e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c7f0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c  T_SUBQUERY.  Wal
1c800 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65  ker w;.  w.xSele
1c810 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
1c820 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
1c830 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
1c840 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
1c850 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
1c860 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1c870 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
1c880 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
1c890 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
1c8a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1c8b0 65 74 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ets of a SELECT 
1c8c0 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
1c8d0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a  ocessing.  The.*
1c8e0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  * following is a
1c8f0 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a  ccomplished:.**.
1c900 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43  **     *  VDBE C
1c910 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
1c920 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  e assigned to al
1c930 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  l FROM-clause te
1c940 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45  rms..**     *  E
1c950 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
1c960 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
1c970 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d  ed for all FROM-
1c980 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
1c990 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20  s..**     *  ON 
1c9a0 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
1c9b0 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e  s are shifted in
1c9c0 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65  to WHERE stateme
1c9d0 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69  nts.**     *  Wi
1c9e0 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20  ldcards "*" and 
1c9f0 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73  "TABLE.*" in res
1ca00 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70  ult sets are exp
1ca10 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  anded..**     * 
1ca20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   Identifiers in 
1ca30 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d  expression are m
1ca40 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73  atched to tables
1ca50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ca60 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73  tine acts recurs
1ca70 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62  ively on all sub
1ca80 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74  queries within t
1ca90 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
1caa0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
1cab0 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Prep(.  Parse *p
1cac0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
1cad0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
1cae0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1caf0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1cb00 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
1cb10 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
1cb20 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
1cb30 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
1cb40 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
1cb50 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20  t for container 
1cb60 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1cb70 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  *db;.  if( NEVER
1cb80 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (p==0) ) return;
1cb90 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1cba0 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  db;.  if( p->sel
1cbb0 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
1cbc0 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b  peInfo ) return;
1cbd0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1cbe0 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70  Expand(pParse, p
1cbf0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1cc00 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
1cc10 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1cc20 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
1cc30 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
1cc40 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
1cc50 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
1cc60 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1cc70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1cc80 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1cc90 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
1cca0 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a  o(pParse, p);.}.
1ccb0 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
1ccc0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
1ccd0 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ulator..**.** Th
1cce0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
1ccf0 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74  mulator is a set
1cd00 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
1cd10 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e   that hold.** in
1cd20 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
1cd30 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61  ts while calcula
1cd40 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ting an aggregat
1cd50 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  e.  This.** rout
1cd60 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65  ine simply store
1cd70 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f  s NULLs in all o
1cd80 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63  f those memory c
1cd90 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
1cda0 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75  void resetAccumu
1cdb0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
1cdc0 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
1cdd0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
1cde0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1cdf0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
1ce00 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
1ce10 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28  nc *pFunc;.  if(
1ce20 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
1ce30 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  +pAggInfo->nColu
1ce40 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  mn==0 ){.    ret
1ce50 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  urn;.  }.  for(i
1ce60 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
1ce70 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1ce80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ce90 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1cea0 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   0, pAggInfo->aC
1ceb0 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d  ol[i].iMem);.  }
1cec0 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
1ced0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
1cee0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
1cef0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
1cf00 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1cf10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cf20 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d  _Null, 0, pFunc-
1cf30 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  >iMem);.    if( 
1cf40 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
1cf50 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
1cf60 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
1cf70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
1cf80 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1cf90 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
1cfa0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
1cfb0 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
1cfc0 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
1cfd0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
1cfe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1cff0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1d000 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
1d010 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
1d020 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
1d030 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
1d040 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
1d050 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
1d060 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1d070 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
1d080 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
1d090 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1d0a0 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
1d0b0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ist);.        sq
1d0c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d0d0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1d0e0 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
1d0f0 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d110 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1d120 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
1d130 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
1d140 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1d150 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
1d160 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
1d170 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
1d180 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
1d190 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
1d1a0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1d1b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1d1c0 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
1d1d0 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
1d1e0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1d1f0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1d200 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1d210 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1d220 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1d230 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
1d240 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
1d250 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
1d260 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
1d270 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
1d280 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
1d290 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
1d2a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
1d2b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
1d2c0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
1d2d0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71  elect) );.    sq
1d2e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d2f0 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
1d300 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20  pF->iMem, pList 
1d310 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
1d320 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1d330 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1d340 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
1d350 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  4_FUNCDEF);.  }.
1d360 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
1d370 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
1d380 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
1d390 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
1d3a0 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
1d3b0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
1d3c0 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
1d3d0 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
1d3e0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
1d3f0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
1d400 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
1d410 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1d420 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1d430 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1d440 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
1d450 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
1d460 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
1d470 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
1d480 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1d490 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
1d4a0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
1d4b0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1d4c0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1d4d0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
1d4e0 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
1d4f0 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
1d500 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
1d510 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
1d520 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
1d530 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1d540 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1d550 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
1d560 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1d570 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ct) );.    if( p
1d580 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
1d590 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
1d5a0 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
1d5b0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1d5c0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
1d5d0 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
1d5e0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
1d5f0 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
1d600 2c 20 72 65 67 41 67 67 2c 20 30 29 3b 0a 20 20  , regAgg, 0);.  
1d610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1d620 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Arg = 0;.      r
1d630 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d  egAgg = 0;.    }
1d640 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69  .    if( pF->iDi
1d650 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
1d660 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
1d670 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1d680 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73  el(v);.      ass
1d690 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
1d6a0 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
1d6b0 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
1d6c0 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
1d6d0 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
1d6e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
1d6f0 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26  ->pFunc->flags &
1d700 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
1d710 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
1d720 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1d730 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
1d740 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1d750 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
1d760 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
1d770 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
1d780 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
1d790 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
1d7a0 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
1d7b0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
1d7c0 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
1d7d0 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
1d7e0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
1d7f0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1d800 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1d810 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
1d820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1d830 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
1d840 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
1d850 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1d860 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1d870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d880 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
1d890 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
1d8a0 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
1d8b0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
1d8c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d8d0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
1d8e0 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
1d8f0 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1d910 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
1d920 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
1d930 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1d940 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
1d950 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1d960 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1d970 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
1d980 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
1d990 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1d9a0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1d9b0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
1d9c0 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
1d9d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d9e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1d9f0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
1da00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1da10 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
1da20 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  se);.    }.  }. 
1da30 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67   for(i=0, pC=pAg
1da40 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70  gInfo->aCol; i<p
1da50 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
1da60 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b  lator; i++, pC++
1da70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1da80 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1da90 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d  C->pExpr, pC->iM
1daa0 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49  em);.  }.  pAggI
1dab0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
1dac0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
1dad0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
1dae0 72 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rse);.}../*.** G
1daf0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1db00 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1db10 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
1db20 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
1db30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
1db40 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
1db50 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
1db60 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
1db70 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1db80 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  of the SelectDes
1db90 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  t structure poin
1dba0 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65  ted to by argume
1dbb0 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66  nt pDest.** as f
1dbc0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1dbd0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20    pDest->eDest  
1dbe0 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
1dbf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
1dc00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dc10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dc20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
1dc30 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20     SRT_Output   
1dc40 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f     Generate a ro
1dc50 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69  w of output (usi
1dc60 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  ng the OP_Result
1dc70 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  Row.**          
1dc80 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64             opcod
1dc90 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  e) for each row 
1dca0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1dcb0 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
1dcc0 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c  _Mem         Onl
1dcd0 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20 72  y valid if the r
1dce0 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c  esult is a singl
1dcf0 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20  e column..**    
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd10 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73 74   Store the first
1dd20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
1dd30 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a  irst result row.
1dd40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1dd50 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73 74         in regist
1dd60 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  er pDest->iParm 
1dd70 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65  then abandon the
1dd80 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   rest.**        
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1dda0 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
1ddb0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70   destination imp
1ddc0 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a  lies "LIMIT 1"..
1ddd0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
1dde0 74 20 20 20 20 20 20 20 20 20 54 68 65 20 72 65  t         The re
1ddf0 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20 73  sult must be a s
1de00 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53  ingle column.  S
1de10 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20 20  tore each.**    
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 61   row of result a
1de40 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61 62  s the key in tab
1de50 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e  le pDest->iParm.
1de60 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
1de70 20 20 20 20 20 20 20 20 20 41 70 70 6c 79 20 74           Apply t
1de80 68 65 20 61 66 66 69 6e 69 74 79 20 70 44 65 73  he affinity pDes
1de90 74 2d 3e 61 66 66 69 6e 69 74 79 20 62 65 66 6f  t->affinity befo
1dea0 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20  re storing.**   
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65 64    results.  Used
1ded0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49   to implement "I
1dee0 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e  N (SELECT ...)".
1def0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55  .**.**     SRT_U
1df00 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65  nion       Store
1df10 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65   results as a ke
1df20 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  y in a temporary
1df30 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1df40 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
1df50 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
1df60 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72  emove results fr
1df70 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  om the temporary
1df80 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1df90 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
1dfa0 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
1dfb0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
1dfc0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1dfd0 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dff0 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b       This is lik
1e000 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65  e SRT_EphemTab e
1e010 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
1e020 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
1e030 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61              is a
1e040 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64  ssumed to alread
1e050 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a  y be open..**.**
1e060 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61       SRT_EphemTa
1e070 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74  b    Create an t
1e080 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
1e090 44 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20  Dest->iParm and 
1e0a0 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  store.**        
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1e0c0 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54   result there. T
1e0d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1e0e0 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20  t open after.** 
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20 20      returning.  
1e110 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54  This is like SRT
1e120 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20 74 68  _Table except th
1e130 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1e140 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20 64            this d
1e150 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73 20  estination uses 
1e160 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1e170 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20 20   to create.**   
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 20 74 68 65 20 74 61 62 6c 65 20 66 69 72 73    the table firs
1e1a0 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
1e1b0 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65 6e  _Coroutine   Gen
1e1c0 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69  erate a co-routi
1e1d0 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ne that returns 
1e1e0 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20  a new row of.** 
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 20 20 72 65 73 75 6c 74 73 20 65 61 63 68      results each
1e210 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76 6f   time it is invo
1e220 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79 20  ked.  The entry 
1e230 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  point.**        
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1e250 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  the co-routine i
1e260 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1e270 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72  ster pDest->iPar
1e280 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
1e290 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74 6f  _Exists      Sto
1e2a0 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79  re a 1 in memory
1e2b0 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61   cell pDest->iPa
1e2c0 72 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  rm if the result
1e2d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1e2e0 20 20 20 20 20 20 20 20 73 65 74 20 69 73 20 6e          set is n
1e2f0 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  ot empty..**.** 
1e300 20 20 20 20 53 52 54 5f 44 69 73 63 61 72 64 20      SRT_Discard 
1e310 20 20 20 20 54 68 72 6f 77 20 74 68 65 20 72 65      Throw the re
1e320 73 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68 69  sults away.  Thi
1e330 73 20 69 73 20 75 73 65 64 20 62 79 20 53 45 4c  s is used by SEL
1e340 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
1e350 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
1e360 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69  ments within tri
1e370 67 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79  ggers whose only
1e380 20 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20   purpose is.**  
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 20 20 74 68 65 20 73 69 64 65 2d 65 66 66 65     the side-effe
1e3b0 63 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73  cts of functions
1e3c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1e3d0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1e3e0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1e3f0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
1e400 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
1e410 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
1e420 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
1e430 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
1e440 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
1e450 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
1e460 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
1e470 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
1e480 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
1e490 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
1e4a0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1e4b0 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
1e4c0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1e4d0 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
1e4e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1e4f0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1e500 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1e510 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1e520 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
1e530 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
1e540 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
1e550 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
1e560 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
1e570 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
1e580 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
1e590 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1e5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1e5b0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
1e5c0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1e5d0 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
1e5e0 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
1e5f0 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
1e600 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1e610 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
1e620 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
1e630 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1e640 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
1e650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e660 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
1e670 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
1e680 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
1e690 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
1e6a0 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
1e6b0 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
1e6c0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
1e6d0 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
1e6e0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
1e6f0 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
1e700 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
1e710 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1e720 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
1e730 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
1e740 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1e750 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
1e760 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
1e770 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1e780 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
1e790 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
1e7a0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
1e7b0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1e7c0 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
1e7d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
1e7e0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
1e7f0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1e800 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
1e810 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e820 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
1e830 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
1e840 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
1e850 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
1e860 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
1e870 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
1e880 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
1e890 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
1e8a0 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
1e8b0 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
1e8c0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
1e8d0 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
1e8e0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
1e8f0 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  n OP_OpenEphemer
1e900 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
1e910 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
1e920 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
1e930 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
1e940 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
1e950 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
1e960 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1e970 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1e980 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
1e990 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
1e9a0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
1e9b0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1e9c0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
1e9d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1e9e0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
1e9f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ea00 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
1ea10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1ea20 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1ea30 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1ea40 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1ea50 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
1ea60 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
1ea70 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
1ea80 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
1ea90 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  ;..  if( Ignorab
1eaa0 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
1eab0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
1eac0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1ead0 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
1eae0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
1eaf0 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
1eb00 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
1eb10 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
1eb20 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1eb30 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 2f 2a  Discard);.    /*
1eb40 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
1eb50 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
1eb60 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
1eb70 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
1eb80 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
1eb90 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
1eba0 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
1ebb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1ebc0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
1ebd0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
1ebe0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1ebf0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
1ec00 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
1ec10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
1ec20 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
1ec30 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65 72 42  p, 0);.  pOrderB
1ec40 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1ec50 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
1ec60 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
1ec70 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
1ec80 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1ec90 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1eca0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
1ecb0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
1ecc0 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65    isAgg = (p->se
1ecd0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
1ece0 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73  egate)!=0;.  ass
1ecf0 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
1ed00 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  ;..  /* Begin ge
1ed10 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
1ed20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1ed30 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1ed40 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
1ed50 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1ed60 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1ed70 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
1ed80 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
1ed90 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
1eda0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1edb0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1edc0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1edd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1ede0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
1edf0 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
1ee00 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
1ee10 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1ee20 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1ee30 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1ee40 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
1ee50 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c  st dest;.    Sel
1ee60 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
1ee70 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
1ee80 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20  int isAggSub;.. 
1ee90 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
1eea0 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  | pItem->isPopul
1eeb0 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ated ) continue;
1eec0 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
1eed0 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
1eee0 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
1eef0 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
1ef00 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
1ef10 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f 20  tree refered to 
1ef20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
1ef30 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
1ef40 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
1ef50 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
1ef60 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1ef70 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
1ef80 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
1ef90 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
1efa0 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
1efb0 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
1efc0 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
1efd0 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
1efe0 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
1eff0 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
1f000 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
1f010 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
1f020 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
1f030 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
1f040 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
1f050 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
1f060 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1f070 74 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  the subquery can
1f080 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
1f090 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f  o the parent. */
1f0a0 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20  .    isAggSub = 
1f0b0 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
1f0c0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
1f0d0 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74  =0;.    if( flat
1f0e0 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
1f0f0 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c  se, p, i, isAgg,
1f100 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20   isAggSub) ){.  
1f110 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62      if( isAggSub
1f120 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67   ){.        isAg
1f130 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  g = 1;.        p
1f140 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
1f150 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
1f160 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31    }.      i = -1
1f170 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f180 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1f190 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
1f1a0 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
1f1b0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
1f1c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1f1d0 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3d  em->isPopulated=
1f1e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1f1f0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1f200 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
1f210 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 50        pItem->isP
1f220 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20  opulated = 1;.  
1f230 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50    }.    if( /*pP
1f240 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20  arse->nErr ||*/ 
1f250 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f260 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
1f270 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
1f280 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
1f290 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53  ight -= sqlite3S
1f2a0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
1f2b0 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  p);.    pTabList
1f2c0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
1f2d0 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
1f2e0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
1f2f0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
1f300 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1f310 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
1f320 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65   = p->pEList;.#e
1f330 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20  ndif.  pWhere = 
1f340 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
1f350 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
1f360 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
1f370 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
1f380 73 44 69 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e  sDistinct = (p->
1f390 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1f3a0 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66  stinct)!=0;..#if
1f3b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f3c0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
1f3d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
1f3e0 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
1f3f0 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
1f400 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
1f410 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
1f420 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1f430 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68      if( p->pRigh
1f440 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tmost==0 ){.    
1f450 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c    Select *pLoop,
1f460 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20   *pRight = 0;.  
1f470 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
1f480 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c  .      int mxSel
1f490 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ect;.      for(p
1f4a0 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
1f4b0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
1f4c0 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20  or, cnt++){.    
1f4d0 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68      pLoop->pRigh
1f4e0 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  tmost = p;.     
1f4f0 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20     pLoop->pNext 
1f500 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
1f510 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70    pRight = pLoop
1f520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f530 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61  mxSelect = db->a
1f540 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
1f550 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
1f560 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  CT];.      if( m
1f570 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d  xSelect && cnt>m
1f580 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  xSelect ){.     
1f590 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1f5a0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
1f5b0 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f  many terms in co
1f5c0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b  mpound SELECT");
1f5d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f5e0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1f5f0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
1f600 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
1f610 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 23  p, pDest);.  }.#
1f620 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
1f630 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
1f640 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
1f650 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
1f660 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
1f670 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
1f680 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1f690 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1f6a0 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
1f6b0 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
1f6c0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
1f6d0 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st, pEList->nExp
1f6e0 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  r) ){.    goto s
1f6f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
1f700 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
1f710 6f 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65  ossible, rewrite
1f720 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 75 73   the query to us
1f730 65 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65  e GROUP BY inste
1f740 61 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a  ad of DISTINCT..
1f750 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 69    ** GROUP BY mi
1f760 67 68 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  ght use an index
1f770 2c 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65 72  , DISTINCT never
1f780 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   does..  */.  as
1f790 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
1f7a0 79 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73 65 6c 46  y==0 || (p->selF
1f7b0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
1f7c0 61 74 65 29 21 3d 30 20 29 3b 0a 20 20 69 66 28  ate)!=0 );.  if(
1f7d0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1f7e0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1f7f0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
1f800 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
1f810 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
1f820 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1f830 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
1f840 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79  0);.    pGroupBy
1f850 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
1f860 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
1f870 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
1f880 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20  .    isDistinct 
1f890 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
1f8a0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
1f8b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
1f8c0 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67  hen this sorting
1f8d0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68  .  ** index migh
1f8e0 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75  t end up being u
1f8f0 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
1f900 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65  a can be .  ** e
1f910 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d  xtracted in pre-
1f920 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49  sorted order.  I
1f930 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
1f940 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  se, then the.  *
1f950 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  * OP_OpenEphemer
1f960 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
1f970 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74  ill be changed t
1f980 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
1f990 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65  e.  ** we figure
1f9a0 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
1f9b0 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e  rting index is n
1f9c0 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
1f9d0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20  addrSortIndex.  
1f9e0 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ** variable is u
1f9f0 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
1fa00 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  e that change.. 
1fa10 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
1fa20 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
1fa30 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
1fa40 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
1fa50 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1fa60 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
1fa70 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
1fa80 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
1fa90 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1faa0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
1fab0 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64  2] = addrSortInd
1fac0 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
1fad0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1fae0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1faf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72               pOr
1fb10 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
1fb20 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1fb30 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
1fb60 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
1fb70 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
1fb80 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64  .    addrSortInd
1fb90 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
1fba0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
1fbb0 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
1fbc0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
1fbd0 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
1fbe0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
1fbf0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1fc00 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
1fc10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fc20 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
1fc30 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
1fc40 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  iParm, pEList->n
1fc50 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
1fc60 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
1fc70 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
1fc80 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1fc90 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75  abel(v);.  compu
1fca0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
1fcb0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
1fcc0 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20  );..  /* Open a 
1fcd0 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
1fce0 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
1fcf0 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
1fd00 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
1fd10 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
1fd20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61  *pKeyInfo;.    a
1fd30 73 73 65 72 74 28 20 69 73 41 67 67 20 7c 7c 20  ssert( isAgg || 
1fd40 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20  pGroupBy );.    
1fd50 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  distinct = pPars
1fd60 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
1fd70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
1fd80 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
1fd90 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  arse, p->pEList)
1fda0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1fdb0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
1fdc0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73  enEphemeral, dis
1fdd0 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdf0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1fe00 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1fe10 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
1fe20 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  se{.    distinct
1fe30 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
1fe40 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e   Aggregate and n
1fe50 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
1fe60 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64  ries are handled
1fe70 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a   differently */.
1fe80 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
1fe90 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
1fea0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
1feb0 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65  is for non-aggre
1fec0 67 61 74 65 20 71 75 65 72 69 65 73 0a 20 20 20  gate queries.   
1fed0 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   ** Begin the da
1fee0 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20  tabase scan.    
1fef0 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
1ff00 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1ff10 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
1ff20 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72  st, pWhere, &pOr
1ff30 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 69  derBy, 0);.    i
1ff40 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
1ff50 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1ff60 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
1ff70 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
1ff80 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
1ff90 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  rior OP_OpenEphe
1ffa0 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  meral .    ** in
1ffb0 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
1ffc0 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
1ffd0 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
1ffe0 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
1fff0 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74  meral.    ** int
20000 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20  o an OP_Noop..  
20010 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64    */.    if( add
20020 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26  rSortIndex>=0 &&
20030 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
20040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20050 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
20060 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20   addrSortIndex, 
20070 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  1);.      p->add
20080 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
20090 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
200a0 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
200b0 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20  d inner loop.   
200c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21   */.    assert(!
200d0 69 73 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 20  isDistinct);.   
200e0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
200f0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
20100 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
20110 42 79 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20  By, -1, pDest,. 
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
20140 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  inue, pWInfo->iB
20150 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  reak);..    /* E
20160 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
20170 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
20180 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  /.    sqlite3Whe
20190 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
201a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
201b0 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63 65  his is the proce
201c0 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
201d0 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
201e0 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
201f0 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
20200 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
20210 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
20220 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
20230 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
20240 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
20250 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
20260 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
20270 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
20280 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
20290 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
202a0 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
202b0 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
202c0 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
202d0 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
202e0 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
202f0 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
20300 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20320 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
20330 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
20340 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
20350 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
20360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20370 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
20380 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
20390 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
203a0 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
203b0 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
203c0 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
203d0 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
203e0 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
203f0 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
20400 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
20410 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
20420 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
20430 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
20440 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
20450 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ECT */..    /* R
20460 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
20470 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
20480 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
20490 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
204a0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
204b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
204c0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
204d0 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
204e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
20500 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
20510 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
20520 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
20530 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
20540 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
20550 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
20560 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
20570 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
20580 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
20590 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
205a0 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20    pItem->iAlias 
205b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
205c0 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42     for(k=pGroupB
205d0 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  y->nExpr, pItem=
205e0 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30  pGroupBy->a; k>0
205f0 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
20600 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
20610 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
20620 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20    }.    }.. .   
20630 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
20640 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
20650 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
20660 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
20670 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
20680 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
20690 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
206a0 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
206b0 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
206c0 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
206d0 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
206e0 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
206f0 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
20700 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
20710 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
20720 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
20730 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
20740 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
20750 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
20760 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
20770 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
20780 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
20790 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
207a0 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
207b0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
207c0 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
207d0 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
207e0 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
207f0 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  r+1 : 0;.    sAg
20800 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
20810 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
20820 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
20830 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
20840 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
20850 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
20860 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64  gList(&sNC, pOrd
20870 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
20880 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
20890 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
208a0 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
208b0 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
208c0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
208d0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
208e0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
208f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20900 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
20910 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
20920 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
20930 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46  erty(sAggInfo.aF
20940 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  unc[i].pExpr, EP
20950 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
20960 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20970 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
20980 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
20990 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e  unc[i].pExpr->x.
209a0 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
209b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
209c0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
209d0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
209e0 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
209f0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
20a00 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
20a10 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
20a20 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
20a30 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
20a40 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
20a50 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
20a60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
20a70 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
20a80 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
20a90 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
20aa0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
20ab0 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
20ac0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b  */.      int j1;
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ae0 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
20af0 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
20b00 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
20b10 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
20b20 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
20b30 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
20b40 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
20b50 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
20b60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
20b70 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
20b80 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
20b90 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
20ba0 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
20bb0 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
20bc0 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
20bd0 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
20be0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
20bf0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
20c00 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
20c10 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
20c20 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
20c30 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
20c40 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
20c50 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
20c60 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
20c70 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
20c80 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
20c90 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
20ca0 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
20cb0 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* Retu
20cc0 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
20cd0 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
20ce0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
20cf0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
20d00 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
20d10 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
20d20 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
20d30 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
20d40 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
20d50 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
20d60 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
20d70 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
20d80 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
20d90 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
20da0 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70  fter all, the Op
20db0 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
20dc0 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
20dd0 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
20de0 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
20df0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
20e00 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
20e10 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
20e20 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
20e30 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
20e40 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
20e50 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
20e60 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
20e70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
20e80 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
20e90 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20  enEphemeral, .  
20ea0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
20eb0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
20ec0 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
20ed0 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
20ee0 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
20ef0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
20f00 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20  HANDOFF);..     
20f10 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
20f20 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
20f30 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
20f40 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
20f50 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
20f60 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
20f70 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
20f80 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
20f90 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
20fa0 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70  m;.      regOutp
20fb0 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  utRow = ++pParse
20fc0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
20fd0 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
20fe0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
20ff0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67  el(v);.      reg
21000 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  Reset = ++pParse
21010 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
21020 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
21030 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
21040 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  );.      iAMem =
21050 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
21060 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
21070 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
21080 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
21090 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iBMem = pParse->
210a0 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
210b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
210c0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
210d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
210e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
210f0 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72  nteger, 0, iAbor
21100 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
21110 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
21120 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22  lear abort flag"
21130 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
21140 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21150 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55  P_Integer, 0, iU
21160 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
21170 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21180 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c  indicate accumul
21190 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 0a  ator empty"));..
211a0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
211b0 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
211c0 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
211d0 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
211e0 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
211f0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
21200 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
21210 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
21220 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
21230 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
21240 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
21250 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
21260 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
21270 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
21280 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
21290 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
212a0 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
212b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
212c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
212d0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
212e0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
212f0 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
21300 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
21310 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
21320 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
21330 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20  &pGroupBy, 0);. 
21340 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
21350 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
21360 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
21370 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
21380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
21390 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20  timizer is able 
213a0 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  to deliver rows 
213b0 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65  in group by orde
213c0 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  r so.        ** 
213d0 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  we do not have t
213e0 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f  o sort.  The OP_
213f0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61  OpenEphemeral ta
21400 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ble will be.    
21410 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64      ** cancelled
21420 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77   later because w
21430 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
21440 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f  use the pKeyInfo
21450 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
21460 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
21470 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
21480 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
21490 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
214a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  {.        /* Row
214b0 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74  s are coming out
214c0 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64   in undetermined
214d0 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65   order.  We have
214e0 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20   to push.       
214f0 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74   ** each row int
21500 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
21510 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  x, terminate the
21520 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20   first loop,.   
21530 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f       ** then loo
21540 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69  p over the sorti
21550 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65  ng index in orde
21560 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74  r to get the out
21570 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  put.        ** i
21580 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20  n sorted order. 
21590 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
215a0 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20    int regBase;. 
215b0 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65         int regRe
215c0 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  cord;.        in
215d0 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t nCol;.        
215e0 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20  int nGroupBy;.. 
215f0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
21600 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
21610 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  nGroupBy = pGrou
21620 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
21630 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75      nCol = nGrou
21640 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  pBy + 1;.       
21650 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b   j = nGroupBy+1;
21660 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
21670 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
21680 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
21690 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e        if( sAggIn
216a0 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74  fo.aCol[i].iSort
216b0 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
216c0 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b             nCol+
216d0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  +;.            j
216e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
216f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21700 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
21710 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
21720 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  pParse, nCol);. 
21730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
21740 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
21750 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
21760 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
21770 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
21780 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c  roupBy, regBase,
21790 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
217a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
217b0 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73  , OP_Sequence, s
217c0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
217d0 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75  dx,regBase+nGrou
217e0 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  pBy);.        j 
217f0 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20  = nGroupBy+1;.  
21800 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21810 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
21820 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
21830 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
21840 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73  o_col *pCol = &s
21850 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b  AggInfo.aCol[i];
21860 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
21870 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
21880 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
21890 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20       int r1 = j 
218a0 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  + regBase;.     
218b0 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a         int r2;..
218c0 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20 3d              r2 =
218d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
218e0 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
218f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43    pCol->pTab, pC
21920 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f  ol->iColumn, pCo
21930 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30  l->iTable, r1, 0
21940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
21950 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20  f( r1!=r2 ){.   
21960 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21970 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21980 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31  OP_SCopy, r2, r1
21990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
219a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
219b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
219c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
219d0 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
219e0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
219f0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
21a00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
21a10 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
21a20 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
21a30 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
21a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21a50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
21a60 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66  xInsert, sAggInf
21a70 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65  o.sortingIdx, re
21a80 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
21a90 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
21aa0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
21ab0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
21ac0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
21ad0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
21ae0 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
21af0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
21b00 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
21b10 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
21b20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21b30 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49  , OP_Sort, sAggI
21b40 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
21b50 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
21b60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
21b70 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74  , "GROUP BY sort
21b80 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  "));.        sAg
21b90 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
21ba0 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Idx = 1;.       
21bb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
21bc0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
21bd0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
21be0 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  * Evaluate the c
21bf0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
21c00 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20  terms and store 
21c10 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e  in b0, b1, b2...
21c20 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73  .      ** (b0 is
21c30 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
21c40 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20   iBMem+0, b1 is 
21c50 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20  iBMem+1, and so 
21c60 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20  forth).      ** 
21c70 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65  Then compare the
21c80 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
21c90 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20  Y terms against 
21ca0 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
21cb0 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ms.      ** from
21cc0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
21cd0 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  w currently stor
21ce0 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32  ed in a0, a1, a2
21cf0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
21d00 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70     addrTopOfLoop
21d10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
21d20 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
21d30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21d40 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
21d50 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
21d60 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
21d70 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
21d80 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
21d90 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
21da0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21db0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
21dc0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
21dd0 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Idx, j, iBMem+j)
21de0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21df0 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
21e00 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
21e10 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
21e20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
21e30 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
21e40 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
21e50 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
21e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
21e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21e80 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
21e90 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
21ea0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
21ed0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
21ee0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  NFO);.      j1 =
21ef0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
21f00 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
21f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21f20 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
21f30 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a  j1+1, 0, j1+1);.
21f40 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
21f50 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
21f60 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
21f70 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
21f80 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
21f90 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
21fa0 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
21fb0 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
21fc0 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
21fd0 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
21fe0 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
21ff0 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
22000 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
22010 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
22020 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
22030 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
22040 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
22050 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
22060 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
22070 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
22080 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
22090 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
220a0 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
220b0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
220c0 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
220d0 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
220e0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
220f0 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
22100 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
22110 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
22120 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
22130 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
22140 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
22150 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22160 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
22170 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
22180 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
22190 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
221a0 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
221b0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
221c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
221d0 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
221e0 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a  Flag, addrEnd);.
221f0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22200 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
22210 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
22220 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22230 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
22240 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
22250 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
22260 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
22270 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
22280 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
22290 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
222a0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
222b0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
222c0 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
222d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
222e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
222f0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
22300 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
22310 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
22320 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
22330 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
22340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22350 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
22360 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
22370 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22380 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
22390 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
223a0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
223b0 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
223c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
223d0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
223e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
223f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22400 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  _Next, sAggInfo.
22410 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
22420 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
22430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22440 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
22450 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
22460 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
22470 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
22480 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b  rSortingIdx, 1);
22490 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
224a0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
224b0 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
224c0 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
224d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
224e0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
224f0 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
22500 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
22510 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22520 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
22530 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20  l row"));..     
22540 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68   /* Jump over th
22550 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20  e subroutines.  
22560 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
22570 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22580 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
22590 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f  drEnd);..      /
225a0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
225b0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
225c0 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
225d0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
225e0 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
225f0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
22600 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
22610 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
22620 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
22630 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
22640 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
22650 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
22660 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
22670 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
22680 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
22690 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
226a0 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
226b0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
226c0 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
226d0 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
226e0 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
226f0 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
22700 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
22710 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
22720 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
22730 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
22740 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
22750 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
22760 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
22770 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22780 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
22790 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
227a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
227b0 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
227c0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
227d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
227e0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
227f0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
22800 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
22810 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
22820 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
22830 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
22840 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
22850 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
22860 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22870 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
22880 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
22890 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
228a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
228b0 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
228c0 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
228d0 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
228e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
228f0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
22900 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
22910 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
22920 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
22930 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
22940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
22950 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
22960 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
22970 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
22980 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
22990 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
229a0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
229b0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
229c0 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , pOrderBy,.    
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229e0 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73    distinct, pDes
229f0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
22a00 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
22a10 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
22a20 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
22a30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
22a40 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
22a50 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
22a60 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22a70 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
22a80 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
22a90 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
22aa0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
22ab0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
22ac0 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
22ad0 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
22ae0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
22af0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
22b00 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
22b10 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
22b20 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
22b30 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
22b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22b50 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
22b60 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
22b70 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
22b80 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
22b90 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
22ba0 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
22bb0 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
22bc0 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45    else {.      E
22bd0 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
22be0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
22bf0 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
22c00 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  T.      Table *p
22c10 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Tab;.      if( (
22c20 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43  pTab = isSimpleC
22c30 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66  ount(p, &sAggInf
22c40 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  o))!=0 ){.      
22c50 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65    /* If isSimple
22c60 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20  Count() returns 
22c70 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
22c80 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  able structure, 
22c90 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
22ca0 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
22cb0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
22cc0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
22cd0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
22ce0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
22cf0 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  tbl>.        **.
22d00 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65          ** where
22d10 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
22d20 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65  ture returned re
22d30 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c  presents table <
22d40 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tbl>..        **
22d50 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
22d60 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f   statement is so
22d70 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20   common that it 
22d80 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65  is optimized spe
22d90 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20  cially. The.    
22da0 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20      ** OP_Count 
22db0 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65  instruction is e
22dc0 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f  xecuted either o
22dd0 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62  n the intkey tab
22de0 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  le that.        
22df0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
22e00 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c  data for table <
22e10 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f  tbl> or on one o
22e20 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49  f its indexes. I
22e30 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  t.        ** is 
22e40 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74  better to execut
22e50 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69  e the op on an i
22e60 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73  ndex, as indexes
22e70 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20   are almost.    
22e80 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70      ** always sp
22e90 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73  read across less
22ea0 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69   pages than thei
22eb0 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
22ec0 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20  tables..        
22ed0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
22ee0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
22ef0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
22f00 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
22f10 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
22f20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43      const int iC
22f30 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  sr = pParse->nTa
22f40 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  b++;     /* Curs
22f50 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65  or to scan b-tre
22f60 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  e */.        Ind
22f70 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
22fa0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
22fb0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
22fc0 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nfo = 0;        
22fd0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
22fe0 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e  o for scanned in
22ff0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  dex */.        I
23000 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65      /* Best inde
23030 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  x found so far *
23040 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
23050 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  oot = pTab->tnum
23060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23070 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73  * Root page of s
23080 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f  canned b-tree */
23090 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
230a0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
230b0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
230c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
230d0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
230e0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
230f0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
23100 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  );..        /* S
23110 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e  earch for the in
23120 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65  dex that has the
23130 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66   least amount of
23140 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20   columns. If.   
23150 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73       ** there is
23160 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c 20   such an index, 
23170 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73 20  and it has less 
23180 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68 65  columns than the
23190 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a   table.        *
231a0 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65 20  * does, then we 
231b0 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20  can assume that 
231c0 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73  it consumes less
231d0 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20 61   space on disk a
231e0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  nd.        ** wi
231f0 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  ll therefore be 
23200 63 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e 20  cheaper to scan 
23210 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
23220 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 20   query result.. 
23230 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
23240 73 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f 74  s case set iRoot
23250 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
23260 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
23270 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20 20  index b-tree.   
23280 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79       ** and pKey
23290 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79 49  Info to the KeyI
232a0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 72 65  nfo structure re
232b0 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67 61  quired to naviga
232c0 74 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  te the.        *
232d0 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  * index..       
232e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
232f0 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
23300 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
23310 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
23320 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
23330 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
23340 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
23350 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
23360 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66      */.        f
23370 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
23380 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
23390 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
233a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 42           if( !pB
233b0 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f  est || pIdx->nCo
233c0 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f 6c  lumn<pBest->nCol
233d0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
233e0 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b     pBest = pIdx;
233f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23410 66 28 20 70 42 65 73 74 20 26 26 20 70 42 65 73  f( pBest && pBes
23420 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d  t->nColumn<pTab-
23430 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
23440 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
23450 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
23460 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
23470 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
23480 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b  (pParse, pBest);
23490 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
234a0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65      /* Open a re
234b0 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
234c0 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43  execute the OP_C
234d0 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20  ount, close the 
234e0 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20  cursor. */.     
234f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23500 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
23510 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74  ead, iCsr, iRoot
23520 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
23530 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
23540 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23550 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
23560 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
23570 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
23580 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
23590 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
235a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
235b0 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
235c0 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
235d0 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
235e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
235f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
23600 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
23610 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
23620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
23630 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
23640 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
23650 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ck if the query 
23660 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
23670 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73   following forms
23680 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
23690 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
236a0 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   min(x) FROM ...
236b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
236c0 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
236d0 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   ....        **.
236e0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74          ** If it
236f0 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
23700 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
23710 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
23720 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
23730 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68       ** as if th
23740 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45  ere was an "ORDE
23750 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45  R ON x" or "ORDE
23760 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61  R ON x DESC" cla
23770 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  use. .        **
23780 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
23790 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
237a0 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
237b0 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
237c0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  n.        ** add
237d0 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72   vdbe code to br
237e0 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70  eak out of the p
237f0 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61  rocessing loop a
23800 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20  fter the .      
23810 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
23820 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
23830 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
23840 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
23850 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
23860 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65  nteed to operate
23870 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68   on the row with
23880 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20   the minimum or 
23890 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20  maximum .       
238a0 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20   ** value of x, 
238b0 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71  the only row req
238c0 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20  uired)..        
238d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20  **.        ** A 
238e0 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
238f0 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
23900 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23910 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
23920 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79         ** modify
23930 20 62 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f   behaviour as fo
23940 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a  llows:.        *
23950 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
23960 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
23970 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
23980 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
23990 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
239a0 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
239b0 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
239c0 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
239d0 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
239e0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
239f0 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20  *     for x..   
23a00 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
23a10 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
23a20 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
23a30 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
23a40 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
23a50 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ch.        **   
23a60 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
23a70 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
23a80 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
23a90 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
23aa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
23ab0 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
23ac0 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
23ad0 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
23ae0 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
23af0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
23b00 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
23b10 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
23b20 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
23b30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
23b40 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
23b50 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
23b60 20 20 75 38 20 66 6c 61 67 20 3d 20 6d 69 6e 4d    u8 flag = minM
23b70 61 78 51 75 65 72 79 28 70 29 3b 0a 20 20 20 20  axQuery(p);.    
23b80 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a      if( flag ){.
23b90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23ba0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
23bb0 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ty(p->pEList->a[
23bc0 30 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  0].pExpr, EP_xIs
23bd0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
23be0 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73       pMinMax = s
23bf0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
23c00 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p(db, p->pEList-
23c10 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  >a[0].pExpr->x.p
23c20 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20 20  List,0);.       
23c30 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61     pDel = pMinMa
23c40 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
23c50 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d   pMinMax && !db-
23c60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
23c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
23c80 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  nMax->a[0].sortO
23c90 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45  rder = flag!=WHE
23ca0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f  RE_ORDERBY_MIN ?
23cb0 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1:0;.           
23cc0 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70   pMinMax->a[0].p
23cd0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
23ce0 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
23cf0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  }.        }.  . 
23d00 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
23d10 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
23d20 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
23d30 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
23d40 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
23d50 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  * processing is 
23d60 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e  much simpler sin
23d70 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ce there is only
23d80 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20   a single row.  
23d90 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70        ** of outp
23da0 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ut..        */. 
23db0 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75         resetAccu
23dc0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
23dd0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
23de0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
23df0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
23e00 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
23e10 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61   pWhere, &pMinMa
23e20 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20  x, flag);.      
23e30 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
23e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
23e50 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
23e60 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
23e70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
23e80 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
23e90 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74   }.        updat
23ea0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
23eb0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
23ec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4d  .        if( !pM
23ed0 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b  inMax && flag ){
23ee0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23ef0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23f00 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e  OP_Goto, 0, pWIn
23f10 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20  fo->iBreak);.   
23f20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
23f30 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20  nt((v, "%s() by 
23f40 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20  index",.        
23f50 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57          (flag==W
23f60 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
23f70 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b  ?"min":"max")));
23f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23f90 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
23fa0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
23fb0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
23fc0 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
23fd0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
23fe0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64     }..      pOrd
23ff0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
24000 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
24010 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
24020 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c  ng, addrEnd, SQL
24030 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
24040 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
24050 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
24060 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20  , p->pEList, 0, 
24070 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20  0, 0, -1, .     
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24090 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c   pDest, addrEnd,
240a0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
240b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
240c0 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
240d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
240e0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
240f0 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
24100 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
24110 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
24120 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  ry */..  /* If t
24130 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
24140 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
24150 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
24160 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
24170 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
24180 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
24190 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
241a0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
241b0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  ){.    generateS
241c0 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
241d0 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
241e0 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
241f0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
24200 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
24210 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
24220 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
24230 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
24240 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
24250 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
24260 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
24270 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
24280 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
24290 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
242a0 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
242b0 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
242c0 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
242d0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
242e0 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
242f0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
24300 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
24310 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
24320 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49  ect_end:..  /* I
24330 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
24340 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20  ames if results 
24350 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  of the SELECT ar
24360 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a  e to be output..
24370 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
24380 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73  QLITE_OK && pDes
24390 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
243a0 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65  tput ){.    gene
243b0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
243c0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
243d0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
243e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
243f0 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  db, sAggInfo.aCo
24400 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
24410 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
24420 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72  .aFunc);.  retur
24430 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  n rc;.}..#if def
24440 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
24450 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  G)./*.**********
24460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244a0 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  *****.** The fol
244b0 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75  lowing code is u
244c0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
244d0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
244e0 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a  ly.  The code.**
244f0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f   that follows do
24500 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
24510 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a   normal builds..
24520 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
24530 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
24540 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63   print out the c
24550 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72  ontent of all or
24560 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70   part of a .** p
24570 61 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20  arse structures 
24580 73 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f  such as Select o
24590 72 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72  r Expr.  Such pr
245a0 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66  intouts are usef
245b0 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e  ul.** for helpin
245c0 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  g to understand 
245d0 77 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e  what is happenin
245e0 67 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64  g inside the cod
245f0 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64  e generator.** d
24600 75 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74  uring the execut
24610 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53  ion of complex S
24620 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
24630 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
24640 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61  utine are not ca
24650 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72  lled anywhere fr
24660 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f  om within the no
24670 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73  rmal.** code bas
24680 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74  e.  Then are int
24690 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c  ended to be call
246a0 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ed from within t
246b0 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f  he debugger.** o
246c0 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79  r from temporary
246d0 20 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d   "printf" statem
246e0 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f  ents inserted fo
246f0 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a  r debugging..*/.
24700 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
24710 74 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a  tExpr(Expr *p){.
24720 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
24730 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
24740 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
24750 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  Token ){.    sql
24760 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24770 22 28 25 73 22 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  "(%s", p->u.zTok
24780 65 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  en);.  }else{.  
24790 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
247a0 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f  intf("(%d", p->o
247b0 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  p);.  }.  if( p-
247c0 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71  >pLeft ){.    sq
247d0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
247e0 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  (" ");.    sqlit
247f0 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
24800 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Left);.  }.  if(
24810 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20   p->pRight ){.  
24820 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24830 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
24840 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
24850 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  p->pRight);.  }.
24860 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24870 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69  intf(")");.}.voi
24880 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
24890 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
248a0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
248b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
248c0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
248d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  ){.    sqlite3Pr
248e0 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  intExpr(pList->a
248f0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
24900 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  if( i<pList->nEx
24910 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  pr-1 ){.      sq
24920 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24930 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  (", ");.    }.  
24940 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
24950 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65  PrintSelect(Sele
24960 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e  ct *p, int inden
24970 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t){.  sqlite3Deb
24980 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c  ugPrintf("%*sSEL
24990 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e  ECT(%p) ", inden
249a0 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c  t, "", p);.  sql
249b0 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
249c0 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  t(p->pEList);.  
249d0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
249e0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20  tf("\n");.  if( 
249f0 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63  p->pSrc ){.    c
24a00 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20  har *zPrefix;.  
24a10 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72    int i;.    zPr
24a20 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20  efix = "FROM";. 
24a30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
24a40 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
24a50 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
24a60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
24a70 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
24a80 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
24a90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24aa0 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c  %*s ", indent+6,
24ab0 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20   zPrefix);.     
24ac0 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20   zPrefix = "";. 
24ad0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
24ae0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
24af0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24b00 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20  rintf("(\n");.  
24b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69        sqlite3Pri
24b20 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e  ntSelect(pItem->
24b30 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b  pSelect, indent+
24b40 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  10);.        sql
24b50 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24b60 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38  "%*s)", indent+8
24b70 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , "");.      }el
24b80 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
24b90 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
24ba0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24bb0 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  f("%s", pItem->z
24bc0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
24bd0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
24be0 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
24bf0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24c00 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22  tf("(table: %s)"
24c10 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
24c20 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
24c30 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
24c40 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
24c50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24c60 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70  intf(" AS %s", p
24c70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
24c80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
24c90 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
24ca0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  -1 ){.        sq
24cb0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24cc0 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (",");.      }. 
24cd0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
24ce0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
24cf0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
24d00 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
24d10 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24d20 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c  tf("%*s WHERE ",
24d30 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
24d40 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
24d50 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pr(p->pWhere);. 
24d60 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24d70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
24d80 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
24d90 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
24da0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
24db0 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e  s GROUP BY ", in
24dc0 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
24dd0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
24de0 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  ist(p->pGroupBy)
24df0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
24e00 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
24e10 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61    }.  if( p->pHa
24e20 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  ving ){.    sqli
24e30 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24e40 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e  %*s HAVING ", in
24e50 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
24e60 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
24e70 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
24e80 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24e90 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
24ea0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
24eb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
24ec0 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
24ed0 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65  ORDER BY ", inde
24ee0 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
24ef0 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
24f00 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  t(p->pOrderBy);.
24f10 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24f20 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
24f30 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68  }.}./* End of th
24f40 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75  e structure debu
24f50 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a  g printing code.
24f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
24fb0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
24fc0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
24fd0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
24fe0 44 45 42 55 47 29 20 2a 2f 0a                    DEBUG) */.